事务异常场景

事务异常场景

A Critique of ANSI SQL Isolation Levels 论文里的异常图
事务异常场景_第1张图片

  • 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 一定有一个先发生,并对另一个可见。

参考

A Critique of ANSI SQL Isolation Levels

你可能感兴趣的:(Transaction,数据库,java,mysql,transaction,事务,写偏序,写倾斜)