最近在研究数据库的事务和并发控制,顺带把以前碰到 MySQL 的间隙锁一起研究。
条件查询和幻象现象(Phantom Phenomenon)
在不考虑 MVCC 的情况下考虑下面两个事务:
T1:
1 | select count(*) from instructor where dept name = 'Physics' |
T2:
1 | insert into instructor values (11111,’Feynman’, ’Physics’, 94000); |
T1 的查询和 T2 的写入是冲突的,如果事务执行序列是 T1 => T2,那么最终的调度就要求是 select 要发生在 insert 之前。如果一个调度的 insert 发生在前,那么这个调度不是一个冲突可串行化调度,这个调度的执行结果和 T1 => T2 的执行结果不一样。