乐观锁和悲观锁
转自:https://www.cnblogs.com/kismetv/p/10787228.html
1.概念
乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。
- 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不加锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
- 悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
2.乐观锁
2.1 版本号机制
版本号机制的基本思路是在数据中增加一个字段version,表示该数据的版本号,每当数据被修改,版本号加1。当某个线程查询数据时,将该数据的版本号一起查出来;当该线程更新数据时,判断当前版本号与之前读取的版本号是否一致,如果一致才进行操作。
比如说查询一条数据版本为a,要更新版本为b,那么
update table_name set version=b where uid=1 and version=a;
如果where判断版本不一致,则说明有其他人进行修改,那么就放弃当前update操作。
2.2 CAS机制
单独介绍。
3.悲观锁
悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁(如MySQL中的排它锁)。
4.适用场景
如果悲观锁和乐观锁都可以使用,那么选择就要考虑竞争的激烈程度(出现并发冲突的概率):
乐观锁:读的多,冲突几率小。认为程序中的并发情况不那么严重,所以让线程不断去重试更新。
悲观锁:写的多,冲突几率大。悲观的认为程序中的并发情况严重,所以严防死守。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2018-08-08 PAT 1029 Median[求中位数][难]
2018-08-08 Andrew Ng-ML-第十二章-机器学习系统设计
2018-08-08 PAT 1028 List Sorting[排序][一般]
2018-08-08 PAT 1027 Colors in Mars[简单][注意]
2018-08-08 PAT 1026 Table Tennis[比较难]