MySQL 的乐观锁和悲观锁是什么?
MySQL 的乐观锁和悲观锁是什么?
回答重点
悲观锁(Pessimistic Locking):
- 假设会发生冲突,因此在操作数据之前就对数据加锁,确保其他事务无法访问该数据。常见于对数据一致性要求较高的场景。
- 实现方式:使用行级锁或表级锁,例如可以使用
SELECT ... FOR UPDATE或LOCK IN SHARE MODE语句来加锁。
乐观锁(Optimistic Locking):
- 假设不会发生冲突,因此在操作数据时不加锁,而是在更新数据时进行版本控制或校验。如果发现数据被其他事务修改,则会拒绝当前事务的修改,需重新尝试。
- 实现方式:通常通过版本号或时间戳来实现,每次更新时检查版本号或时间戳是否一致。
扩展知识
适用场景
1)乐观锁适合并发冲突少,读多写少的场景,不用通过加锁只需通过比较字段版本号(或时间戳)是否发生改变的形式,无锁操作,吞吐量较高。
数据库实现乐观锁的例子(版本号):
1 | -- 假设有一张用户表 users,包含 id、name 和 version 字段 |
2)悲观锁适合并发冲突多,写多读少的场景。通过每次加锁的形式来确保数据的安全性,吞吐量较低。
数据库实现悲观锁的例子:
1 | -- 读取数据并加锁 |
Comments