乐观锁和悲观锁详解,具体概念介绍

TheDisguiser 2020-05-22 17:17:42 java常见问答 5828

大家知道乐观锁悲观锁吗?这是两种特殊的数据库锁机制,一般作用于解决java高并发问题,下面,就让我们一起来详细的了解一下它们吧。

一、乐观锁具体概念及原理

乐观锁通俗的说,就是一个乐观的机制,这个机制在其他线程每次拿数据时都乐观的认为它们肯定不会修改数据的,所以它不会去上锁,但是在更新的期间还是会判断一下这期间有没有不识趣的线程去修改这个数据。乐观锁可以使用版本号等机制实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

悲观锁与乐观锁各有各的优点与缺点,不能够片面的认为一种好于另一种,如乐观锁这种适用于写操作较少的就适用于冲突真的极少发生时,这样可以极大节省锁的开销,加大整个系统吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

乐观锁一般是相对悲观锁而言的。乐观锁太乐观了,所以它采取的加锁机制会更为宽松。乐观锁一般不会去刻意使用数据库本身的锁机制,它会依赖数据本身来保证数据的正确性。

乐观锁它相信事务之间的数据竞争的概率是比较小的,因此它会尽可能的直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。

二、悲观锁具体概念及原理

悲观锁,跟乐观锁一样,你一看名字就知道它很悲观,它的机制就是在每次去拿数据的时候都认为肯定会有不识时务的线程来捣乱,所以它与乐观锁相反,每次拿数据都会上一次锁,这样别想要拿到数据就会一直block直到它拿到锁。

在传统的关系型数据库中就用到了很多这种锁机制,如行锁,表锁等,读锁,写锁等各种锁功能,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

以上就是关于乐观锁与悲观锁的一些介绍了,如果你还想要了解更多与之相关的java常见问答知识,就请关注咱们的网站吧。

推荐阅读:

乐观锁和悲观锁的区别有什么?有什么作用?

乐观锁和悲观锁的实现要如何配置?具体概念是什么?

乐观锁是什么?怎么实现乐观锁?