乐观锁和悲观锁
一、乐观锁
认为对同一个数据的并发操作,不会造成冲突。在事务要提交更新的时候,才会对数据进行冲突校验。
第一次读的时候,获取到某个字段值,如版本或时间戳。处理完业务逻辑要开始更新的时候,需要再次查看这个字段是不是和第一次一样。如果一样就更新,反之拒绝。
可以使用数据版本记录机制或时间戳实现。
经典应用:共享文档,CAS,MVCC。
特点:并发度高,不会发生死锁。
二、悲观锁
具有强烈的独占和排他特性。认为并发操作一定会修改数据。所以在处理数据之前,要先对数据加锁,直到完成修改才释放锁。
比如MySQL默认可重复读隔离级别,使用悲观锁,要先关闭set_autocommit=0的自动提交属性。
使用lock in share mode 和 for update两种方式来实现select的读取锁。lock in share mode在一个事务要update同一个表单的时候,会很容易造成死锁。
for update有行锁和表锁。
特点:并发度小。
三、总结
悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下