MySQL 的乐观锁和悲观锁是什么?

Sherwin.Wei Lv7

MySQL 的乐观锁和悲观锁是什么?

回答重点

悲观锁(Pessimistic Locking)

  • 假设会发生冲突,因此在操作数据之前就对数据加锁,确保其他事务无法访问该数据。常见于对数据一致性要求较高的场景。
  • 实现方式:使用行级锁或表级锁,例如可以使用 SELECT ... FOR UPDATELOCK IN SHARE MODE 语句来加锁。

乐观锁(Optimistic Locking)

  • 假设不会发生冲突,因此在操作数据时不加锁,而是在更新数据时进行版本控制或校验。如果发现数据被其他事务修改,则会拒绝当前事务的修改,需重新尝试。
  • 实现方式:通常通过版本号或时间戳来实现,每次更新时检查版本号或时间戳是否一致。

扩展知识

适用场景

1)乐观锁适合并发冲突少,读多写少的场景,不用通过加锁只需通过比较字段版本号(或时间戳)是否发生改变的形式,无锁操作,吞吐量较高。

数据库实现乐观锁的例子(版本号):

1
2
3
4
5
6
7
8
-- 假设有一张用户表 users,包含 id、name 和 version 字段
-- 读取数据
SELECT id, name, version FROM users WHERE id = 1;

-- 更新数据时检查版本号
UPDATE users
SET name = 'new_name', version = version + 1
WHERE id = 1 AND version = current_version;

2)悲观锁适合并发冲突多,写多读少的场景。通过每次加锁的形式来确保数据的安全性,吞吐量较低。

数据库实现悲观锁的例子:

1
2
3
4
5
-- 读取数据并加锁
SELECT id, name FROM users WHERE id = 1 FOR UPDATE;

-- 执行更新操作
UPDATE users SET name = 'new_name' WHERE id = 1;
Comments
On this page
MySQL 的乐观锁和悲观锁是什么?