在看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菜鸟,有问题欢迎指出。