数据库事务隔离(Transaction Isolation)是数据库管理系统(DBMS)中用来控制多个并发事务同时执行时,彼此之间如何“看见”对方数据的机制。它是关系型数据库事务的四大特性(ACID)中 I(Isolation,隔离性) 的具体实现。
当多个事务并发操作同一份数据时,如果不加控制,可能会出现以下问题:
脏读(Dirty Read)
读到另一个事务尚未提交的数据,若对方回滚,读到的就是无效数据。
不可重复读(Non-Repeatable Read)
同一事务内多次读同一数据,结果不一样(因为别的事务修改并提交了它)。
幻读(Phantom Read)
同一事务内多次查询,记录“数量”变了(别的事务插入或删除了符合查询条件的数据)。
从低到高,隔离性逐渐增强,并发性能逐渐降低:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(Read Uncommitted) | ❌ 可能 | ❌ 可能 | ❌ 可能 |
| 读已提交(Read Committed) | ✅ 避免 | ❌ 可能 | ❌ 可能 |
| 可重复读(Repeatable Read) | ✅ 避免 | ✅ 避免 | ❌ 可能* |
| 串行化(Serializable) | ✅ 避免 | ✅ 避免 | ✅ 避免 |
*注:MySQL(InnoDB)在“可重复读”下通过 MVCC + 间隙锁基本避免了幻读。
Read Uncommitted
几乎不用,性能高但数据极不可靠。
Read Committed(读已提交)
多数数据库默认(如 PostgreSQL、Oracle、SQL Server)。
Repeatable Read(可重复读)
MySQL 默认隔离级别。
Serializable(串行化)
事务排队执行,最安全但最慢。
数据库通常通过以下技术实现隔离:
事务隔离就是:在保证数据正确性的前提下,决定“你能看到别的事务到哪一步”。
如果你愿意,我也可以用例子 + 图表或结合 MySQL / Java / Spring 来讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。