在并发控制领域,乐观锁和悲观锁是两种最根本的策略。它们代表了两种截然不同的假设:悲观锁假设冲突总会发生,因此事先加锁;乐观锁假设冲突很少发生,因此先执行操作,提交时再检查冲突。本文从原理、特性、优缺点、使用场景、代码实现到进阶实践进行全面对比,帮助你在不同业务场景下做出正确选择。
1. 基础内容介绍
1.1 悲观锁
悲观锁(Pessimistic Locking)是一种保守的并发控制策略。它假定每次数据访问都会发生冲突,因此在读取数据时就对其加锁,阻止其他事务并发修改,直到当前事务结束才释放锁。
实现方式:
数据库层面:
SELECT ... FOR UPDATE对查询到的行加排它锁;LOCK TABLE加表级锁。应用层面:使用
synchronized或ReentrantLock对代码块加锁。分布式层面:使用 Redis、ZooKeeper 等实现分布式互斥锁。
锁粒度:可以锁定单行、多行、表甚至整个数据库。
1.2 乐观锁
乐观锁(Optimistic Locking