简述乐观锁和悲观锁

1.乐观锁和悲观锁的概念意义

        乐观锁和悲观锁就像人一样,乐观的人认为车到山前必有路,悲观的人总觉得世界对他不友好,;乐观的人在操作数据时非常乐观,认为别人不会同时修改数据,所以乐观锁不会上锁,只是在操作数据的时候判断一下在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。悲观的人在操作数据时比较悲观,认为别人会同时修改数据。所以在操作数据时直接把数据锁住,直到操作完成后才会解锁,上锁期间其他人不能修改数据。就像svn上的go locked。

2.乐观锁和悲观锁的实现方式

        乐观锁 :当数据库被修改时,数据操作会被记录version,当有两个请求同时进行操作的话,此时提交先操作的会把之前查询到的version与现在的数据的version进行比较,版本相同则可以提交version+1,版本不同则视为数据过期。sql:update 表名 set 字段名=“ ”,version=version+1 where 条件 and version=#{version}:乐观锁不会加锁,而是通过状态的检验达到操作互斥的效果,就像上面说的说会对比操作前与当前数据的版本号,状态标记是否一致。

        悲观锁:悲观锁是为防止一切数据冲突,它是以一种防御格挡的姿态在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面先操作的人把锁释放后下一个人数据加锁才可对数据进行加锁,然后才可以对数据进行操作,一般数据库本身锁的机制都是基于悲观锁的机制实现的。读锁:lock tables 表名read,解锁:unlock  tables;设锁:lock tables test_db write。

3.乐观锁和悲观锁是使用场景

        从限制来讲 与悲观锁相比,乐观锁适用的场景受到了更多的限制,无论是CAS还是版本号机制。再比如版本号机制,如果query的时候是针对表1,而update的时候是针对表2,也很难通过简单的版本号来实现乐观锁。

        当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源。

        当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源。

4.总结

        对于可控的事情要保持谨慎,对于不可控的事情要保持乐观,人只能做自己能力范围内的事情,你必须要接受这个事实,并且以乐观的心去应对这一切。

谨记,目力所致之处,尽量力所能及。无论面对什么事情,你都要乐观面对,冷静处理。

水了一期,今天是2022年10月24日祝福广大程序员节日快乐。鹏程万里,前途似海。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值