乐观锁和悲观锁

一、乐观锁

认为对同一个数据的并发操作,不会造成冲突。在事务要提交更新的时候,才会对数据进行冲突校验。

第一次读的时候,获取到某个字段值,如版本或时间戳。处理完业务逻辑要开始更新的时候,需要再次查看这个字段是不是和第一次一样。如果一样就更新,反之拒绝。

可以使用数据版本记录机制或时间戳实现。

经典应用:共享文档,CAS,MVCC。

特点:并发度高,不会发生死锁。

二、悲观锁

具有强烈的独占和排他特性。认为并发操作一定会修改数据。所以在处理数据之前,要先对数据加锁,直到完成修改才释放锁。

比如MySQL默认可重复读隔离级别,使用悲观锁,要先关闭set_autocommit=0的自动提交属性。

使用lock in share mode 和 for update两种方式来实现select的读取锁。lock in share mode在一个事务要update同一个表单的时候,会很容易造成死锁。

for update有行锁和表锁。

特点:并发度小。

三、总结

悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景。

posted @   花与不易  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示