乐观锁和悲观锁的使用场景及应用

一、定义

1、乐观锁:顾名思义,对每次的数据操作都保持乐观的态度,不担心数据会被修改,所以不会对数据进行上锁。由于数据没有上锁,这就存在数据会被多人读写的情况。所以每次修改数据的时候需要对数据进行判断是否被修改过。

2、悲观锁:与乐观锁相反,对每次的数据操作都保存悲观的态度,总是担心数据会被修改,所以在自己操作的时候会对数据上锁,防止在自己操作的时候被他人同时操作导致更新丢失。

二、使用场景

1、乐观锁:由于乐观锁的不上锁特性,所以在性能方面要比悲观锁好,比较适合用在DB的读大于写的业务场景。

2、悲观锁:对于每一次数据修改都要上锁,如果在DB读取需要比较大的情况下有线程在执行数据修改操作会导致读操作全部被挂载起来,等修改线程释放了锁才能读到数据,体验极差。所以比较适合用在DB写大于读的情况。

三、实现

1、乐观锁:目前比较常用的有两种方式,第一种是使用版本号或者时间戳。在表中加个version或updatetime字段,在每次更新操作时对此一下该字段,如果一致则更新数据,数据不等则放弃本次修改,根据实际业务需求做相应的处理。第二种是CAS方式,即Java中的compareAndSwap。CAS操作涉及到三个操作数,内存值(valueOffSet)、期望值(expect)、更新值(update)。当内存值与期望值一致时就会更新数据,反之不操作。

2、悲观锁:一、数据库实现方式,使用数据库的读锁、写锁、行锁等实现进程的悬挂阻塞等当前操作完成后才能进行下一个操作。二、在Java里面可以使用synchronize实现悲观锁。

 

 

人有悲欢离合,月有阴晴圆缺,此事古难全。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乐观锁悲观锁都是常见的机制,用于解决并发访问数据时可能出现的数据一致性问题。它们在使用场景上有一些差异。 乐观锁适用于并发读取操作较多,写入操作较少的场景乐观锁的实现方式是在读取数据时不加,而是在更新数据时进行版本比较。如果在更新数据时发现版本已经被其他线程修改,则会回滚当前操作,让用户重新操作。乐观锁的优点是实现简单,不会阻塞其他操作。但是它无法阻止除程序之外的数据库操作,并且在写入冲突较多时可能导致较多的重试操作。 悲观锁适用于写入操作较频繁的场景悲观锁是在读取数据时加,阻塞其他线程的写入操作,直到当前线程完成读取操作后才释放悲观锁的优点是可以保证数据的一致性,但是它会增加的开销,降低系统的吞吐量。悲观锁适用于对数据一致性要求较高的场景,但是需要注意避免死问题。 总之,乐观锁适用于读多写少的场景悲观锁适用于写多读少并对数据一致性要求较高的场景。具体使用哪种机制需要根据业务场景和需求来进行分析和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [乐观锁悲观锁的介绍以及应用场景](https://blog.csdn.net/weixin_64366370/article/details/128648091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [乐观锁悲观锁各自适用场景是什么?](https://blog.csdn.net/sD7O95O/article/details/116382290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值