伴随着事务的不同隔离等级,会出现不同的读取现象。ANSI/ISO 标准 SQL 92指出两个事务并发执行,一个事务读数据,另一个事务写数据时可能出现的三种情况。
- 幻影读(Phantom reads)
事务T1进行两次相同的查询,前后2次查询的结果由于事务T2插入了新数据产生了不同的结果。
T1 T2
select * from account where balance > 100;
insert into account(balance) values(200);
commit;
select * from account where balance > 100;
commit;
事务T1由于第二次查询结果多了事务T2新插入的值,和第一次查询时的结果不一致,多出了一条 balance = 200 的数据。
这种情况在低于串行化(Serializable)的隔离等级:可重复的读(Repeatable Read), 读已提交(Read Commited), 读未提交(Read Uncommited)下会发生。
- 不可重复读(None-repeatable reads)
事务T1对同一数据进行两次查询,由于事务T2对相同数据的修改,导致事务T1前后两次查询结果
不一致(不可重复)。
T1 T2
select * from account where id = 1;
update account set balance = 200 where id = 1;
commit;
select * from account where id = 1;
commit;
假设事务T1第一次查询后的结果balance = 100,由于事务T2的介入,第二次对同一数据的查询将会得到和第一次不同的结果balance = 200。
这种情况在低于可重复读(Repeatable Read的)隔离等级:读已提交(Read Commited), 读未提交(Read Uncommited)下会发生。
- 脏读(Dirty reads)
事务T1读取到事务T2更新却未提交的数据,随后由于回滚或者更新覆盖导致事务T1读取到无效数据。
T1 T2
update account set balance = 200 where id = 1;
select * from account where id = 1;
commit;
rollback;
由于事务T2的缘故,事务T1将会读取到 balance = 200 的结果,但是事务T2随后进行了回滚,事务T1读取了无效数据。
这种情况在低于读已提交(Read Commited)的隔离等级:读未提交(Read Uncommited)下会发生。
上诉三种情况,从下到上,为了避免相应的情况发生,要求的隔离等级依次升高。
526




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



