想问一下关于乐观锁的理解

星星误 2018-08-24 09:35:34

1)先读task表的数据(实际上这个表只有一条记录),得到version的值为versionValue

2)每次更新task表中的value字段时,为了防止发生冲突,需要这样操作

update task set value = newValue,version = versionValue + 1 where version = versionValue;

只有这条语句执行了,才表明本次更新value字段的值成功

对于上面的定义解释 ,就着两个人同时借阅最后一本书加乐观锁的操作,我的问题是:

当A浏览器 和 B浏览器同时借阅最后一本书时,只有一个能借阅的到,

开始借阅之前 , A B 浏览器的version版本均为一

借阅之后,因为每次更新,version值会加一,

假如A借阅到了,

那么version = versionValue + 1 此时A的version值为2

那么B在借阅这本书时 A已经借阅到了,所以version = versionValue + 1 =2+1=3

但是这个跟第一次更新拿到的version值不相等 ,则被视为过期数据,驳回B浏览器的借阅请求

请问我这样理解可以吗?

还有能告诉我 update task set value = newValue,version = versionValue + 1 where version = versionValue;中 versionValue,version,newvalue,value的值是多少吗 ?我有点混……
...全文
157 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongkaiming 2018-08-25
  • 打赏
  • 举报
回复
乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
假设a,b两个人刚好同时操作数据库,都先查询一次取出数据,version都是1。当a用户update数据后version为2,2大于数据库的1所以予以更新,此时b用户也update之前去的是1现在加1等于2,此时数据库version=2,那么2等于2被认为是过期数据(提交的数据版本号大于数据库表当前版本号才更新),需要重新获取数据操作。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧