数据库的悲观锁和乐观锁

当我们要对一个数据库中的一条数据进行修改的时候, 为了避免同时被其他人修改, 最好的办法就是直接对该数据进行加锁以防止并发. 加锁分为乐观锁和悲观锁.

悲观锁

一般认为数据被并发修改的概率比较大, 所以需要在修改之前先加锁.

并发控制实际上是“先取锁再访问”的保守策略, 为数据处理的安全提供了保证.

但是在效率方面, 处理加锁的机制会让数据库产生额外的开销, 还有增加产生死锁的机会.

另外, 还会降低并行性, 一个事务如果锁定了某行数据, 其他事务就必须等待该事务处理完才可以处理那行数据.

简言之就是 事务 + 行锁.

select * FROM table with(rowlock,updlock) WHERE 1=1 and CBM in ('30060')

乐观锁

假设数据一般情况下不会造成冲突, 所以在数据进行提交更新的时候, 才会正式对数据的冲突与否进行检测.

如果发现冲突了, 则让返回用户错误的信息, 让用户决定如何去做.

如何选择

在乐观锁与悲观锁的选择上面, 主要看下两者的区别以及适用场景就可以了.

1、乐观锁并未真正加锁, 效率高. 一旦锁的粒度掌握不好, 更新失败的概率就会比较高, 容易发生业务失败.

2、悲观锁依赖数据库锁, 效率低. 更新失败的概率比较低.