事务异常场景
事务异常场景
A Critique of ANSI SQL Isolation Levels 论文里的异常图
// TODO image
P0 Dirty Write:脏写
P1 Dirty Read:脏读
P4C Cursor Lost Update:游标丢失更新
P4 Lost Update:丢失更新
P2 Fuzzy Read:不可重复读
P3 Phantom:幻读
A5A Read Skew:读偏序
A5B Write Skew:写偏序
脏读
读到另一个事务尚未提交的数据。
不可重复读
同一个事务内多次读,读到的数据不同,也就是当前事务读到了其他事务提交的数据。
幻读
事务内多次查询一个范围的记录,返回的记录数不同。
脏写
当前事务回滚了其他事务提交的数据。
T1更新;T2更新;T1回滚,回滚掉了T2的更新
丢失更新
当前事务提交覆盖了其他事务提交的数据。
T2更新;T1更新;T1提交,覆盖掉了T2的更新。
游标丢失更新
本质上就是丢失更新,只是因为发生在游标上,所以称之为游标丢失更新。
读偏序(读倾斜)
t0时刻:T1读取x;
t1时刻:T2更新x,y;T2提交;
t2时刻:T1读取y;
t2 时刻事务T1读取的y是被事务T2修改后的数据,此时已经不是t0时刻事务T1读取x时对应的y值,导致数据不一致。
写偏序(写倾斜)
快照隔离允许写偏序异常发生,两个事务(T1 和 T2)同时读取一个重叠的数据集(例如值 V1 和 V2),同时进行不相交的更新(例如T1更新V1,T2更新V2),最后同时提交,两者都没有看到对方进行的更新。
如果是可串行化隔离级别,这样的异常不可能发生,因为 T1 或 T2 一定有一个先发生,并对另一个可见。
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 flyingzc's blog!