当我们要对一个数据库中的一条数据进行修改的时候, 为了避免同时被其他人修改, 最好的办法就是直接对该数据进行加锁以防止并发. 加锁分为乐观锁和悲观锁.
悲观锁
一般认为数据被并发修改的概率比较大, 所以需要在修改之前先加锁.
并发控制实际上是“先取锁再访问”的保守策略, 为数据处理的安全提供了保证.
但是在效率方面, 处理加锁的机制会让数据库产生额外的开销, 还有增加产生死锁的机会.
另外, 还会降低并行性, 一个事务如果锁定了某行数据, 其他事务就必须等待该事务处理完才可以处理那行数据.
简言之就是 事务 + 行锁.
select * FROM table with(rowlock,updlock) WHERE 1=1 and CBM in ('30060')
乐观锁
假设数据一般情况下不会造成冲突, 所以在数据进行提交更新的时候, 才会正式对数据的冲突与否进行检测.
如果发现冲突了, 则让返回用户错误的信息, 让用户决定如何去做.
如何选择
在乐观锁与悲观锁的选择上面, 主要看下两者的区别以及适用场景就可以了.
1、乐观锁并未真正加锁, 效率高. 一旦锁的粒度掌握不好, 更新失败的概率就会比较高, 容易发生业务失败.
2、悲观锁依赖数据库锁, 效率低. 更新失败的概率比较低.