并发控制容易导致活锁和死锁。
加锁主要是防止不可重复和读脏数据以及。
共享锁(S锁)
Share Lock
S锁一般用于表级,事务T对数据对象A加上S锁,则事务T可以读A但是不能修改它,而在T释放S锁之前,其他事务只能对A再加S锁,而不能再加X锁,这就保证了在事务T释放A上的共享锁之前,获取锁的其他事务只能对A读而不能进行其他修改。通常A被读取完毕,S锁立即释放。
排它锁(X锁)
Exclusive Lock
X锁是行级锁,事务T对数据对象A加上X锁,则T对A既可读又可写,此时其他事务不能对A加其他锁。获取锁的其他事务对A既可读又可写。X锁要直到事务结束时才会释放。
更新锁(U锁)
Update lock
一次只有一个事务能获取数据对象A 的U锁,它允许其他事务读取,但其他事务不能再加U锁和X锁,当资源被更新时,U锁升级到X锁,U锁直到事务完成才会被释放。
https://blog.csdn.net/C_J33/article/details/79487941
借鉴了该博客的图。
悲观锁(Pessimistic Lock)
悲观锁则是采用数据库提供的锁机制。这会导致数据库性能的开销大大增加。具有强烈的独占性和排他性。
乐观锁(Optimistic Lock)
乐观锁一般是由程序员实现,一般采用版本号和时间戳的方法。假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回错误的信息,乐观锁开销较小。