MySQL 示例
MySQL 示例
BEGIN;
SELECT * FROM orders
WHERE id BETWEEN 100 AND 200
FOR UPDATE;
-- 其它事务在该区间的 INSERT 会被阻塞(间隙被锁)
COMMIT;| InnoDB | 范围锁读/部分写会锁间隙;等值条件也会锁相邻间隙(取决于索引) |
|---|---|
| PostgreSQL | 仅行级锁 + 快照;幻读由快照与 SSI(串行化)处理 |
| 影响 | 间隙锁提高并发正确性,也更容易与其他事务相互等待 |
InnoDB 在 REPEATABLE READ 下用 next-key 锁(记录锁+间隙锁)锁住范围,防住别的事务在区间内插入;PostgreSQL 没有间隙锁。
BEGIN;
SELECT * FROM orders
WHERE id BETWEEN 100 AND 200
FOR UPDATE;
-- 其它事务在该区间的 INSERT 会被阻塞(间隙被锁)
COMMIT;| InnoDB | 范围锁读/部分写会锁间隙;等值条件也会锁相邻间隙(取决于索引) |
|---|---|
| PostgreSQL | 仅行级锁 + 快照;幻读由快照与 SSI(串行化)处理 |
| 影响 | 间隙锁提高并发正确性,也更容易与其他事务相互等待 |