伴随着事务的不同隔离等级,会出现不同的读取现象。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前后两次查询结