乐观锁悲观锁定义在哪里,yii2.0乐观锁与悲观锁怎么用

科技资讯 投稿 6500 0 评论

乐观锁悲观锁定义在哪里,yii2.0乐观锁与悲观锁怎么用

以下内容主要是针对遇上yii2.0乐观锁与悲观锁怎么用等问题,我们该怎么处理呢。下面这篇文章将为你提供一个解决思路,希望能帮你解决到相关问题。

什么是乐观锁与悲观锁

在多用户环境下,同时访问同一行数据时,会产生数据冲突的问题。乐观锁与悲观锁就是两种解决并发修改数据的方式。

悲观锁会在读取数据时加锁,保证在修改完毕前数据不被其他人修改,但这种方式会导致并发性降低。而乐观锁则是在更新数据时检查是否被其他人修改过,如果被修改过就中断操作,否则进行更新。

如何使用Yii2.0的乐观锁与悲观锁

要使用Yii2.0的乐观锁与悲观锁,需要借助yii\db\ActiveRecord和yii\db\OptimisticLock或yii\db\PessimisticLock的功能,具体的使用方法如下。

乐观锁的使用

使用Yii2.0的乐观锁,需要将ActiveRecord的optimisticLock属性设置为相应的锁字段。例如,在用户表中,为了保证邮箱地址的唯一性,我们假设邮箱地址是一个锁字段。那么我们需要将ActiveRecord中的optimisticLock属性设置为该字段:


namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    public static function tableName()
    {
        return 'user';
    }

    public function optimisticLock()
    {
        return 'email';
    }
}

然后,在执行保存操作时,需要调用save方法的时候就会自动检查是否被其他人修改过。如果没有被修改,就会进行保存操作。否则就会返回失败。

悲观锁的使用

使用Yii2.0的悲观锁,需要在查询数据时,通过调用forUpdate或forShare方法来加锁。例如,在查询用户表中id为1的用户数据时,需要加锁,可以如下调用:


$user = User::find()
    ->where(['id' => 1])
    ->forUpdate()
    ->one();

forUpdate方法表示只锁定返回的行,而forShare则表示共享锁不仅会锁定返回的行,还会锁定所有和该行相关的数据。比如说,下面这个查询会锁定用户和它的地址,因为“LEFT JOIN”语句中使用了users表和addresses表:


$user = User::find()
    ->where(['id' => 1])
    ->leftJoin('addresses', 'users.id = addresses.user_id')
    ->forShare()
    ->one();

需要注意的是,使用悲观锁会对性能有影响,需要权衡利弊。

总结

以上就是为你整理的yii2.0乐观锁与悲观锁怎么用全部内容,希望文章能够帮你解决相关问题,更多请关注本站相关栏目的其它相关文章!

编程笔记 » 乐观锁悲观锁定义在哪里,yii2.0乐观锁与悲观锁怎么用

赞同 (30) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽