Java学习篇之乐观锁和悲观锁

2022-03-28  本文已影响0人  宜宣_6c9f

虽然干Java很久了,但是对于悲观锁和乐观锁的定义和使用还是太少了,最近项目遇到了这样的问题,网上也有很多干货,刚好趁机学习下。

做java的都知道,在应用场景中会出现一种叫并发的问题,当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。

为了处理这种并发问题,就引出了悲观锁和乐观锁的定义。

悲观锁顾名思义,处理事物的态度很悲观,总以为别人会修改自己的数据,所以每次都对该数据进行加锁防止。悲观锁,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。

乐观锁顾名思义,处理事物的态度很乐观,采取了更加宽松的加锁机制。也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性。

具体在业务场景中使用哪种得视情况而定了。因为二者皆有各自的优劣势。

1响应效率:如果需要非常高的响应速度,建议采用乐观锁方案,成功就执行,不成功就失败,不需要等待其他并发去释放锁。乐观锁并未真正加锁,效率高。一旦锁的粒度掌握不好,更新失败的概率就会比较高,容易发生业务失败。
2冲突频率:如果冲突频率非常高,建议采用悲观锁,保证成功率。冲突频率大,选择乐观锁会需要多次重试才能成功,代价比较大。
3重试代价:如果重试代价大,建议采用悲观锁。悲观锁依赖数据库锁,效率低。更新失败的概率比较低。
4乐观锁如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户从新操作。悲观锁则会等待前一个更新完成。这也是区别。

上一篇 下一篇

猜你喜欢

热点阅读