悲观锁与乐观锁

数据库层面的悲观锁与乐观锁

悲观锁

数据库中,悲观并发控制是一种并发控制的方法,这种方法简称是悲观锁。它可以阻止一个事物以影响其他用户的方式来修改数据。如果一个事物的某个操作应用了锁,那只有这个事物把锁释放时,其他事物才能够执行与该锁冲突的操作。

主要应用于数据争用激烈的场合,以及发生并发冲突时使用锁保护数据的成本低于事物回滚成本的环境中。

悲观锁实际上是采用了“先取锁再访问”的保守策略,使数据处理更加安全,但是,这样就增加了数据库的开销,而且还有死锁的可能。并且在只读操作中,是不需要加锁的,盲目的加锁只会增加系统的负载。

乐观锁

乐观锁的全称是乐观并发控制,也是一种并发控制方法。它假设多用户并发的事物在实际操作时不会彼此影响,各个事物能够在不加锁的情况下处理各自影响的那部分数据。

在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。

可以发现,悲观锁是通过加锁实现并发控制,乐观锁是通过回滚实现并发控制。

应用场景:与悲观锁正好相反,乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。

虽然乐观锁减少了数据库的开销和系统的负载,也不会产生死锁,但还是会发生不可预期的结果。