在数据库里,SERIALIZABLE(可串行化) 是事务隔离级别中最严格的一级,目标是:让并发执行的事务,在结果上等价于某种“一个接一个串行执行”的顺序。
下面从「要解决的问题 → 实现原理 → 常见实现方式」讲清楚。
多个事务并发执行时,如果不加控制,会出现:
SERIALIZABLE 要保证:
无论你怎么并发跑,最终结果都像事务被“排队依次执行”一样 正确且一致
注意:
可串行化 ≠ 真的一个一个跑,而是“结果等价”。
数据库通常通过**事务之间的“冲突操作”**来判断是否可串行化。
两个操作冲突,当且仅当:
典型冲突:
如果一个并发执行顺序,可以通过交换不冲突的操作,变成一个“事务首尾不交叉”的串行顺序,那它就是冲突可串行化的。
示例:
T1: R(A) W(A)
T2: R(A) W(A)
并发:
R1(A) R2(A) W1(A) W2(A)
→ 可化为 T1 然后 T2
→ 可串行化
不同数据库实现方式不同,常见有 3 类:
✅ 优点:严格正确
❌ 缺点:锁多、易死锁、吞吐低
MySQL InnoDB 的 SERIALIZABLE 基本靠 2PL + 间隙锁
如 PostgreSQL(真正 SERIALIZABLE):
✅ 读性能好
❌ 写冲突时要回滚
适合读多写少场景。
| 问题 | 是否防止 |
|---|---|
| 脏读 | ✅ |
| 不可重复读 | ✅ |
| 幻读 | ✅ |
| 写偏斜 | ✅(真 SERIALIZABLE) |
⚠️ 注意:
SERIALIZABLE 的原理是:通过锁 / 版本 / 冲突检测,保证并发事务的执行结果,等价于某个串行执行顺序,从而绝对不会出现一致性问题。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。