宝哥软件园

浅谈Yii乐观锁定的用途和原理

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

本文介绍了Yii乐观锁的用途和原理,并做了学习笔记与大家分享,希望对大家有所帮助

原则:

数据表中使用int类型的字段来存储版本号,即该行中记录的版本号。更新数据时,比较版本号是否一致

sql查询代码如下(伪代码)

update ` test _ ver ` set ` name `=' Lili '和' ver `=2其中` id `=1和` ver `=1,即在更新时的where查询条件中,带来了之前查询记录时得到的版本号。如果其他线程修改了记录,版本号将不可避免地不一致,因此更新失败。

例子

记录表

假设以下数据表

模型类

appmodelsTestVer

此模型类重写了BaseActiveRecord类中的优化锁方法

声明用于记录版本号的字段

/* * *乐观锁定* @返回字符串*/public function optimal lock(){ return ' ver ';}公共函数updateRecord(){ $ ver=self : findone([' id '=1]);$ ver-name=' Lili ';$ RES=$ ver-update();返回$ res}updateRecord修改id为1的记录

控制器

在控制器中调用updateRecord方法

公共函数action version(){ $ testVer=new testVer();$ RES=$ testVer-updateRecord();返回$ this-render(' version ');}Yii调试器结果

检查数据库选项,您可以看到实际执行的sql语句。

有一种说法如下

更新' test _ ver ` set ` name `=' Lili ',' ver `=' 2 '其中(' id `=' 1 ')和(' ver `=' 1') YII乐观锁定实现原理

实现原理在yiidbbaseactiverecord : updateinternal()的方法中

受保护函数updateInternal($ attributes=null){ if(!$ this-BeforeSave(false)){ return false;}//获取要更新的字段和新字段值$ values=$ this-getdirtyattributes($ attributes);if(空($ values)){ $ this-after save(false,$ values);返回0;}//以原始ActiveRecord的主键作为以后更新记录的条件。//也就是说最多只有一条记录。$ condition=$ this-getOldPrimaryKey(true);//获取版本号字段的字段名,如ver $ lock=$ this-optimal lock();//如果最优性锁定()返回空值,则乐观锁定不会启用。if ($lock!==null) {//$this-$lock在这里的意思是$ this-ver;//ver 1作为这里要更新的字段之一。$ values[$ lock]=$ this-$ lock 1;//这里,把旧版本号作为更新$condition[$lock]=$this-$lock的另一个条件;} $rows=$this-updateAll($values,$ condition);//如果乐观锁定已启用,但更新尚未完成,或者更新记录数为0;//表示由于ver不匹配,记录被修改,所以抛出异常。if ($lock!==null!$rows) {抛出新的StaleObjectException('正在更新的对象已过时);} $ changedAttributes=[];foreach($ values as $ name=$ value){ $ changedAttributes[$ name]=isset($ this-_ oldAttributes[$ name])?$ this-_ oldAttributes[$ name]: null;$ this-_ oldAttributes[$ name]=$ value;} $this-afterSave(false,$ changedAttributes);返回$ rows}从上面的代码,不难得出:

当乐观锁定()返回null时,乐观锁定将不会启用。版本号只增不减。通过乐观锁定有两个条件,一个是主键应该存在,另一个是能够完成更新。启用乐观锁定后,只有在以下两种情况下才会引发StaleObjectException异常:当记录被其他人删除时,由于主键不再存在,更新失败。版本号已更改,不满足更新的第二个条件。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+