浅谈Yii乐观锁的使用及原理

本文介绍了Yii乐观锁的使用及原理,自己做个学习笔记,也分享给大家,希望对大家有用处

原理:

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

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

update `test_ver` set `name`="lili" and `ver`=2 where `id`=1 and `ver`=1

即在更新时的where查询条件中,带上之前查询记录时得到的版本号,如果其他线程已经修改了该记录,则版本号势必不会一致,则更新失败

示例

数据表

假设有如下数据表

模型类

appmodelsTestVer

该模型类,重写BaseActiveRecord类中的optimisticLock方法

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

/** * 乐观锁 * @return string */ public function optimisticLock() { return 'ver'; } public function updateRecord(){ $ver = self::findOne(['id'=>1]); $ver->name = "lili"; $res = $ver->update(); return $res; }

updateRecord修改id为1的记录

控制器

控制器中调用updateRecord方法

public function actionVersion(){ $testVer = new TestVer(); $res = $testVer->updateRecord(); return $this->render('version'); }

Yii Debugger结果

查看database选项,可以查看到实际执行的sql语句。

有一条语句如下

UPDATE `test_ver` SET `name`='lili', `ver`='2' WHERE (`id`='1') AND (`ver`='1')

Yii乐观锁实现原理

实现原理在yiidbBaseActiveRecord::updateInteranl()方法

protected function updateInternal($attributes = null) { if (!$this->beforeSave(false)) { return false; } // 获取等下要更新的字段及新的字段值 $values = $this->getDirtyAttributes($attributes); if (empty($values)) { $this->afterSave(false, $values); return 0; } // 把原来ActiveRecord的主键作为等下更新记录的条件, // 也就是说,等下更新的,最多只有1个记录。 $condition = $this->getOldPrimaryKey(true); // 获取版本号字段的字段名,比如 ver $lock = $this->optimisticLock(); // 如果 optimisticLock() 返回的是 null,那么,不启用乐观锁。 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) { throw new StaleObjectException('The object being updated is outdated.'); } $changedAttributes = []; foreach ($values as $name => $value) { $changedAttributes[$name] = isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null; $this->_oldAttributes[$name] = $value; } $this->afterSave(false, $changedAttributes); return $rows; }

从上面的代码中,我们不难得出:

当 optimisticLock() 返回 null 时,乐观锁不会被启用。 版本号只增不减。 通过乐观锁的条件有2个,一是主键要存在,二是要能够完成更新。 当启用乐观锁后,只有下列两种情况会抛出 StaleObjectException 异常: 当记录在被别人删除后,由于主键已经不存在,更新失败。 版本号已经变更,不满足更新的第二个条件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 08:50:30

浅谈Yii乐观锁的使用及原理的相关文章

浅谈利用JavaScript进行的DDoS攻击原理与防御

        这篇文章主要介绍了浅谈利用JavaScript进行的DDoS攻击原理与防御,以及介绍了相关的中间人攻击原理,需要的朋友可以参考下            分布式拒绝服务攻击(DDoS)攻击是一种针对网站发起的最古老最普遍的攻击.Nick Sullivan是网站加速和安全服务提供商CloudFlare的一名系统工程师.近日,他撰文介绍了攻击者如何利用恶意网站.服务器劫持和中间人攻击发起DDoS攻击,并说明了如何使用HTTPS以及即将到来的名为"子资源一致性(Subresource I

浅谈网站百度权重分析工具的原理及可靠性

自从谷歌退出中国以后,pr的更新就开始变的极其不规律,甚至经历过去年4.1更新之后,半年都不没再更新一次的状况.就当大家都认为谷歌把pr取消了,结果又突然在去年12月份更新了一次,这次更新了没多久呢,又更新了一次,大家对pr的信心也就稍稍恢复了一些.前几天,谷歌官方查询pr的端口发生了变化,导致国内查询pr的工具失效,于是关于谷歌取消pr的言论甚嚣尘上,不过事实证明pr取消只是一个扯,现在各个工具查询pr的功能也都已经恢复了.不过,经过这么一来二去的折腾,pr的地位也正在逐渐下降着.事实上,就算

浅谈sqlserver中的事务和锁

昨日"拜读"<sqlserver2005高级程序设计>和<SQL Server 2008编程入门经典(第3版)>这两本翻译后的中文版书籍.竟然发现目录结构大致一样,其讲解的内容几乎差不多.有抄袭的嫌疑.看到"事务和锁"那一张中,发现连举的小例子.表格都一模一样.哈哈...对这类书籍,真不想做太多评论了.国内那些翻译版的书籍嘛.说真的,大部分翻译得有点生硬.而那些"原创著作"嘛.大多是相互抄袭,空谈.就微软技术体系而言,如果

浅谈ADO.NET文章系列之二 — 并发更新冲突的处理

ado 声明:这里只对并发冲突做简单的分析,所以在前面冠以"浅谈"二字,希望大家可以从中看到一般的处理方法和注意的事项,如果有什么疏漏,那也相当地自然,毕竟本人水平有限,还有很多需要提高的地方,希望各位朋友不吝指正!一.为什么会产生并发在我们使用ado.net对数据库中数据进行操作时,很有可能这种操作或类似地操作也在网络内其他用户中进行着,那么就难以避免地会遇到更新操作失败的情况.因为为了更好地提高性能,ado.net采用了断开连接的方式.也就是说要先把数据的副本读取到客户端,那么也容

浅谈如何提高编程效率?

浅谈如何提高编程效率?1.提高工作经验 经验来自实践.平时多阅读一些技能方面的书籍和来自各网站上的优秀文章.如果说,一本书就是一个台阶,那么在人的一生中将有千万道台阶等着我去跨越.每跨越一步台阶,将得到不可估量的财富,而下一步台阶,又将带我步入一个新的境界,获取新的知识. 看到学到做到.平时有时间多看看大牛写的代码,多看看开源的项目并参与一些开源项目的编码工作.2.和大牛.勤奋的人一起工作 和大牛有经验的程序猿一起工作.和勤奋的人一起共事.永远不要相信"你改变不了环境,但可以改变自已."

浅谈iOS Crash(一)

本文讲的是浅谈iOS Crash(一),一.捕获iOS Crash 1.设置异常断点并运行 设置异常断点.png 说明:设置Xcode异常断点后运行程序,发生Crash时,断点会定位到出错的代码行,但仅适用于开发阶段.线上APP的Crash还需要通过收集Crash机制来捕获Crash并记录在日志中. 2.Mach异常 和 Unix信号 iOS Crash发生时,先产生Mach异常(最底层的内核级异常),然后Mach异常在host层被ux_exception转换为相应的Unix信号,并通过thre

浅谈12306核心模型设计思路和架构设计

原文:浅谈12306核心模型设计思路和架构设计 春节期间,无意中看到一篇文章,文章中讲到12306的业务复杂度远远比淘宝天猫这种电商网站要复杂.后来自己想想,也确实如此.所以,很想挑战一下12306这个系统的核心领域模型的设计.一般的电商网站,购买都是基于商品的概念,每个商品有一定量的库存,用户的购买行为是针对商品的.当用户发起购买行为时,系统只需要生成订单并对用户要购买的商品减库存即可.但是,12306就不是那么简单了,具体复杂在哪里,我下面会进一步分析.   另外一个让我写这篇文章的原因,是

烦人的“小妖精”:浅谈小红点的设计

导语 随着各类App的业务功能不断丰富,小红点已经成为互联网从业者们最常使用的运营工具之一,每当有新的运营内容或新功能上线,大家的做法往往是"在那放个红点就行了".然而简单粗暴的形式以及不加节制的投放,让小红点变成了人人厌烦的"小妖精".本文从设计的角度出发浅谈小红点的一些设计细节,期望引起大家对小红点的关注,在这里抛砖引玉,也期待感兴趣的小伙伴一起探讨. 烦人的小红点 人类似乎天生对不对称,不和谐的事物有厌烦心理,并且想要去纠正这些"错误",简

《参禅与悟道》——浅谈人生

转载自CSDN赵4老师,赵老师应该是一个相当有资历的程序员了,我在很多CSDN帖子里面看到他的身影,看他的回帖获益匪浅 这篇是赵老师的一些感悟吧,转载自http://blog.csdn.net/zhao4zhong1/article/details/2452128 思考一下这个问题, 知识层面:从小学到初中,再到高中.大学.硕士.博士.院士.诺贝尔奖获得者. 财富层面:从乞丐到--,到全球首富. 权力层面:从小组长到--,到联合国秘书长. 为什么都不乏乐观|悲观,积极|消极,自认为日子过的快乐|