数据库---(2)乐观锁和悲观锁

并发控制手段:

乐观锁(乐观并发控制)

悲观锁(悲观并发控制)

悲观锁:

当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前先锁定,再修改的方式称之为悲观并发控制。

悲观并发控制实际上是:

    先取锁再访问的保守策略,为数据处理的安全提供了保证。

     在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外还会降低并发性,一个事务如果锁定了某行数据,其他事务就必须等待该事物处理完才可以处理那行数据。

乐观锁:

是相对于悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在进行数据提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

相对于悲观锁,在对数据库。进行处理的时候,乐观锁并不会使用数据库提供的机制。一般的实现乐观锁的方式就是记录数据版本。

悲观锁的实现方式

悲观锁的实现,往往依靠数据库提供的锁机制。在数据库中,悲观锁的流程如下:

  1. 在对记录进行修改前,先尝试为该记录加上排它锁。
  2. 如果枷锁失败,说明该记录正在被修改,那么当前查询可能需要等待或者跑出异常。
  3. 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。
  4. 期间如果有其他对该记录做修改或加排它锁的操作,都会等待我们解锁或者抛出异常。

乐观锁的实现方式

使用乐观锁就不需要借助数据库的锁机制了。

乐观锁主要就是两个步骤:冲突检测和数据跟新。

其实现方式有一种典型的就是compare and swapCAS)。

CAS是一项乐观锁技术,当多个线程尝试使用CSA同时跟新一个变量时,只有其中一个线程能更新变量的值,而其他线程都失败,失败的线程不会被挂起,而是被告知在这次竞争中失败,并可以再次尝试。

乐观锁和悲观锁的选择。

  1. 乐观锁并未真正加锁,效率高。一旦锁的粒度掌握不好,更新失败的概率会比较高,容易发生业务失败。
  2. 悲观锁依赖于数据库锁,效率低。更新失败的的概率比较低。

猜你喜欢

转载自blog.csdn.net/qq_42159433/article/details/89289392