在数据库里,SERIALIZABLE(可串行化)隔离级别的目标是:
并发执行的事务,效果等价于按某种顺序串行执行。
下面从实现原理、常见手段、优缺点和示例来说明。
SERIALIZABLE ≠ 真的串行执行,而是:
通过并发控制机制,让事务之间互不干扰,最终结果与某种串行执行一致。
典型代表:MySQL InnoDB、Oracle、SQL Server
两个阶段:
| 操作 | 锁类型 |
|---|---|
| SELECT | 共享锁(S Lock) |
| UPDATE / DELETE / INSERT | 排他锁(X Lock) |
| 范围查询 | 间隙锁 / Next-Key Lock |
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT * FROM orders WHERE amount > 100;
-- 会对扫描到的数据加共享锁,阻塞其他事务修改
UPDATE orders SET amount = amount + 1 WHERE id = 1;
COMMIT;
✅ 优点:
❌ 缺点:
典型代表:PostgreSQL SERIALIZABLE
Serializable Snapshot Isolation(SSI)
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM account WHERE id = 1;
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT;
✅ 优点:
❌ 缺点:
典型代表:单线程数据库、某些内存数据库
✅ 优点:
❌ 缺点:
| 实现方式 | 是否真正串行 | 并发性能 | 典型数据库 |
|---|---|---|---|
| 两阶段锁(2PL) | 否 | 低 | MySQL、Oracle |
| MVCC + SSI | 否 | 中~高 | PostgreSQL |
| 完全串行 | 是 | 极低 | 教学/特殊系统 |
| 问题 | 是否解决 |
|---|---|
| 脏读 | ✅ |
| 不可重复读 | ✅ |
| 幻读 | ✅ |
| 写偏斜(Write Skew) | ✅ |
注:
- MySQL 的 REPEATABLE READ 用 Next-Key Lock 也能防止幻读
- 但 写偏斜问题只能 SERIALIZABLE 保证
✅ 适合场景
❌ 不适合场景
SERIALIZABLE 的实现方式主要有:
- 严格加锁(2PL)
- MVCC + 提交时冲突检测(SSI)
- 或完全串行执行
代价是:
一致性最强,但并发性能最差。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。