并发控制
作用
sequenceDiagram
actor 用户1
actor 用户2
participant 数据库
用户1->>数据库: 读取数据A
用户2->>数据库: 修改数据A
数据库-->>用户1: 可能读取到不一致数据
本质
协调多用户同时访问数据库的机制,保证数据一致性
并发问题
问题类型 | 说明 | 解决方案 |
---|---|---|
脏读 | 读取到未提交的数据 | 共享锁 |
不可重复读 | 同一事务内多次读取结果不同 | 行级锁 |
幻读 | 同一查询返回不同行数 | 范围锁 |
示例
-- 悲观锁示例
BEGIN TRANSACTION;
SELECT * FROM products
WHERE id = 1 FOR UPDATE; -- 加排他锁
UPDATE products SET stock = stock - 1
WHERE id = 1;
COMMIT;
-- 乐观锁示例
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = 1 AND version = 5; -- 检查版本号
注意事项
- 锁粒度选择:
- 表锁:开销小,并发低
- 行锁:开销大,并发高
- 死锁检测和预防策略
- MVCC(多版本并发控制)是常见解决方案
- 根据业务场景选择合适的隔离级别