什么是脏读_mysql事务异常解释

17次阅读

脏读是指事务读取了另一事务未提交且最终回滚的数据,导致读到“短暂存在、最终消失”的中间状态;MySQL 默认隔离级别 REPEATABLE READ 通过 MVCC 避免脏读,仅 READ UNCOMMITTED 级别允许脏读。

什么是脏读_mysql 事务异常解释

脏读是指一个事务读取了另一个事务尚未提交的修改数据,而后者随后回滚,导致前者读到的数据在数据库中根本不存在。

脏读的核心特征

关键在于「未提交 + 被读取 + 后续回滚」三个环节同时发生。它不是数据被改错了,而是读到了一段“短暂存在、最终消失”的中间状态。

  • 事务 A 更新某行余额为 1000,但没执行 COMMIT
  • 事务 B 此时 SELECT 读到 1000,并据此做业务判断(比如允许用户下单)
  • 事务 A 因异常 ROLLBACK,余额恢复为原始值(比如 800)
  • 事务 B 已基于 1000 做出的操作,就失去了数据依据

为什么MySQL 默认不会脏读

MySQL InnoDB 引擎默认隔离级别是 REPEATABLE READ,该级别通过 MVCC(多版本并发控制)机制自动规避脏读。即使在 READ COMMITTED 下,也只读已提交版本,同样不脏读。只有显式设为READ UNCOMMITTED 时才会开放脏读能力——这在生产环境几乎不用。

脏读和不可重复读的 区别

很多人混淆这两者,其实关键看数据是否“真正落地”:

  • 脏读:读的是别人 没提交过 的数据,对方一回滚就没了
  • 不可重复读:读的是别人 已提交 的数据,所以两次读结果不同,但每次都是真实有效的

如何验证或触发脏读(仅测试用)

若需观察脏读现象,可在会话中临时降级隔离级别:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

之后开启两个事务,让一个 UPDATE 不提交,另一个直接 SELECT 即可复现。但请勿在正式库中启用该级别。

text=ZqhQzanResources