当前位置:主页 > 查看内容

【JavaP6大纲】MySQL篇:悲观锁、乐观锁、排它锁、共享锁、表级

发布时间:2021-05-20 00:00| 位朋友查看

简介:悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁? 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。适用于写为居多的场景下。比如行锁,表锁等,读锁,写锁,syncronized……

悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁?

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。适用于写为居多的场景下。比如行锁,表锁等,读锁,写锁,syncronized实现的锁等。sql中实现悲观锁,使用for update对数据加锁,例如:select num from goods where id = 1 for update;

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,在表中增加一个版本(version)或时间戳(timestamp)来实现。适用于读为居多的场景下。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

工作流程:
获取当前数据版本
更新操作版本号+1
提交更新时,获取版本号
比较提交时的版本号与第一次获取的版本号,如果一致,那么认为资源是最新的,可以更新
否则回滚或者抛出异常

案例:
事务一开启,男柜员先执行读操作,取出金额和版本号,执行写操作,此时金额改为 120,版本号为1,事务还没有提交
事务二开启,女柜员先执行读操作,取出金额和版本号,执行写操作,此时金额改为 50,版本号变为 1,事务未提交

现在提交事务一,金额改为 120,版本变为1,提交事务。理想情况下应该变为 金额 = 50,版本号 = 2?

;原文链接:https://blog.csdn.net/java_wxid/article/details/115486954
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐