脏读 (Dirty Read)
脏读是指一个事务读取了另一个未提交事务修改过的数据。如果那个未提交的事务最终被回滚,那么第一个事务读取的数据就是无效的"脏数据"。
示例:
• 事务A修改了某行数据但未提交
• 事务B读取了事务A修改后的数据
• 事务A回滚了修改
• 事务B读取的数据实际上是无效的
不可重复读 (Non-repeatable Read)
不可重复读是指在同一事务内,多次读取同一数据返回的结果不同。这通常是因为在两次读取之间,另一个事务修改并提交了该数据。
示例:
• 事务A第一次读取某行数据
• 事务B修改了该行数据并提交
• 事务A再次读取同一行数据
• 两次读取结果不一致
幻读 (Phantom Read)
幻读是指在同一事务内,多次执行相同的查询返回不同的行集。这是由于其他事务在两次查询之间插入了新行。
示例:
• 事务A查询满足某条件的行,返回10行
• 事务B插入2行满足该条件的数据并提交
• 事务A再次执行相同查询,返回12行
丢失更新 (Lost Update)
当两个事务同时读取同一数据并基于读取的值进行修改时,后提交的事务会覆盖前一个事务的修改,导致前一个事务的更新丢失。
数据库隔离级别
这些现象与数据库的隔离级别密切相关:
1. 读未提交 (Read Uncommitted):允许脏读、不可重复读和幻读
2. 读已提交 (Read Committed):防止脏读,但允许不可重复读和幻读
3. 可重复读 (Repeatable Read):防止脏读和不可重复读,但允许幻读
4. 串行化 (Serializable):最高隔离级别,防止所有这些问题
不同数据库系统对这些隔离级别的实现可能略有差异,例如MySQL的InnoDB在"可重复读"级别下通过多版本并发控制(MVCC)也能防止大部分幻读情况。

浙公网安备 33010602011771号