Luminous.X in the house  
Enjoy my whole life!

脏读 (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)也能防止大部分幻读情况。

posted on 2025-05-12 15:07  Luminous_X  阅读(25)  评论(0)    收藏  举报