看乐观锁引发的思考

 在看java学习文档是看到了乐观锁的介绍:

感到有些疑惑。

之前我看mybatis-plus的文档时,看到了乐观锁的插件,实验了一下,原理就是,在新增的时候添加一个版本号version,比如我存0,然后在修改的时候先对数据进行读操作,假设读的version值为0,然后修改的时候where 后加上 version=0,如果不满足条件,就不会对数据进行更新。

为什么失败就要重复读-比较-写的操作呢?问了下GPT

具体来说,当某个用户开始进行数据更新时,系统会记录下当前的版本号或时间戳。当其他用户也试图更新同一份数据时,系统会检查当前的版本号或时间戳与之前记录的是否一致。如果一致,说明该数据没有被修改过,可以继续进行更新操作;如果不一致,说明数据已经被其他用户修改过,此时更新操作可能会被中断或采取其他冲突解决策略。

想想自己真是有些蠢,对数据更新失败,最终不就是要更新数据么,所以失败了就要重复读-比较-写操作。

然后我想问问GPT乐观锁有什么实际意义

然后我又产生疑问,什么是保证数据一致性有什么意义?

看到这里,我现在才了解到锁的重要性。

场景是,确认收货时,先从库存表中获取库存数量,然后减去订单数量,然后再对数据库进行update操作,如果并发量大,两个事务A,B,事务A获取库存数量后,事务B已经完成了数据库更新操作,然后事务A再进行库存减少更新操作,就让库存的数量变的不准确了。知识还是要和实际相关联才更容易理解。

我又有个疑问,mysql的默认隔离等级是可重复读,如果使用乐观锁,前后读的版本号不是一致的吗,这样的话不是乐观锁没有用么?

后来百度了下,是因为可重复读分为快照读和当前读,update是当前读,所以可以读到最新的版本号。文章在这里

https://blog.csdn.net/qq_19286785/article/details/134134344

java菜鸟,有问题欢迎指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值