在 MySQL 的 InnoDB 存储引擎中,脏读、不可重复读和幻读是并发事务操作时可能出现的数据不一致问题,不同的事务隔离级别对这些问题有不同的处理方式。
1、脏读(Dirty Read)
定义:一个尚未提交的数据变更的事务,被一个查询事务读取到了。如果数据变更的事务最终回滚了,那么读取到的数据就是无效的、“脏” 的数据。
产生原因:在 “读未提交(Read Uncommitted)” 隔离级别下,事务可以读取其他事务未提交的数据。
示例:
-- 会话 1
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- 此时会话 2 进行读取操作
-- 会话 2
START TRANSACTION;
SELECT balance FROM account WHERE id = 1; -- 可能读到会话 1 未提交的修改,即 balance 减少了 100
-- 会话 1 回滚事务
ROLLBACK;
在上述示例中,会话 2 读取到了会话 1 未提交的修改,若会话 1 最终回滚,会话 2 读取的数据就是无效的。
2、不可重复读(Non-Repeatable Read)
定义:在一个事务内,多次读取同一数据时,由于其他事务对该数据进行了修改并提交,导致每次读取的结果不一致。
产生原因:在 “读已提交(Read Committed)” 隔离级别下,一个事务只能读取其他事务已经提交的数据,但在本事务执行过程中,其他事务可能会修改数据并提交,从而导致不可重复读。
示例:
-- 会话 1
START TRANSACTION;
SELECT balance FROM account WHERE id = 1; -- 第一次读取,假设余额为 1000

最低0.47元/天 解锁文章
1711

被折叠的 条评论
为什么被折叠?



