面试中的乐观锁 (悲观锁和乐观锁面试题)

程序员、计算机、编程、后端开发

吐槽

面试官:什么是乐观锁请举例

程序员:瑟瑟发抖 不懂啊

基础准备

  • 乐观锁
  • 并发操作
  • MYSQL

我以为举过悲观锁案例,大家可以先看看这篇

悲观锁具体案例

乐观锁面试技巧,面试必问系列谈谈乐观锁与悲观锁

具体案例

乐观锁CAS(Compare and Swap 比较并交换)

MYSQL

现在创建一张表,注意version版本字段,乐观锁就是靠这个字段

乐观锁面试技巧,面试必问系列谈谈乐观锁与悲观锁

下面业务代码一般是这样的

开启一个事务

第一步,把第一次查询出来的version值获取可能是1也可能是10

其他DB操作完毕后

最后一步把第一步查询到的version值,赋值到where version=version值

然后update如果成功,committ提交事务

如果update数据影响行为0,事务失败必须rollback

乐观锁面试技巧,面试必问系列谈谈乐观锁与悲观锁

乐观锁用来防并发

上面例子如果一个线程进来执行中,

另一个线程刚好也进来执行中

提交时一个版本号已经变更了,另一个版本号肯定更新会失败

防并发其实还有其他方案队列、缓存锁等等 这里先不谈

总结

  • 乐观锁防并发也是个不错的方案
  • 乐观锁经典是SVN、GIT这样的版本控制工具
  • 乐观锁宽入严出

悲观锁乐观锁比较

乐观锁面试技巧,面试必问系列谈谈乐观锁与悲观锁

  • 乐观锁防并发会异常提示,悲观锁会等待除非超时才会异常
  • 乐观锁是非阻塞算法,悲观锁是阻塞算法
  • 悲观锁用的不好容易死锁,乐观锁用的不好结果就不可预期
  • 悲观锁的并发访问性不好
  • 乐观锁加锁的时间要比悲观锁短,性能完胜悲观锁(加锁时间看)
  • 乐观锁看作是关于冲突检测的,那么悲观锁就是冲突避免
  • 冲突很少,或冲突后果不会很严重,那么通常应该选择乐观锁,因为它能得到更好并发性,而且更容易实现
  • 冲突结果对于用户来说痛苦的,那么就需要使用悲观策略,如转账业务
  • 发现失败太迟的代价会很大,就不要用乐观锁

乐观锁面试技巧,面试必问系列谈谈乐观锁与悲观锁

程序员专家欢迎来喷,指出我的问题