SQL 事务隔离级别(Transaction Isolation Levels) 是用来定义在并发事务执行时,一个事务对其他事务的“可见性”和“影响程度”的标准。它的核心目标是在并发性能与数据一致性之间做权衡。
当多个事务同时操作数据库时,可能会出现以下问题:
脏读(Dirty Read)
读到另一个事务未提交的数据,若该事务回滚,读到的就是无效数据。
不可重复读(Non-Repeatable Read)
同一事务内,两次读取同一数据,结果不同(被别的事务修改并提交)。
幻读(Phantom Read)
同一事务内,两次查询满足条件的数据集,行数不同(被别的事务插入/删除)。
从低到高:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED(读未提交) | ❌ 可能 | ❌ 可能 | ❌ 可能 |
| READ COMMITTED(读已提交) | ✅ 避免 | ❌ 可能 | ❌ 可能 |
| REPEATABLE READ(可重复读) | ✅ 避免 | ✅ 避免 | ❌ 可能* |
| SERIALIZABLE(串行化) | ✅ 避免 | ✅ 避免 | ✅ 避免 |
*注:MySQL InnoDB 在 REPEATABLE READ 下通过 MVCC + 间隙锁避免了幻读,但 SQL 标准本身不保证。
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置会话级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
如果你需要,我也可以结合 InnoDB 实现原理(MVCC、锁) 或 不同数据库对比 来讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。