正常所说的snapshot isolation只对冲突写进行约束,由于会有write skew一些问题,到不了serialization级别。
本文提出了一个新的概念write snapshot isolation
的概念,区别普通的snapshot isolation
,之前的snapshot isolation
这里称之为read snapshot isolation
。
符合以下两点的事务在write snapshot isolation
隔离级别下是冲突的,必须回滚一个事务:
RW-spatial overlap
txnj修改r,txni读取r。RW-temporal overlap
Ts (txn i) < Tc (txn j) < Tc (txn i).
也就是说,两个时间上并行的非只读事务,如果先提交的事务修改了后提交事务中读取的数据,那么两个事务必须回滚一个。回滚哪个事务?应该回滚后提交的事务,因为后提交的事务可能执行时间很长。
write snapshot isolation
能够达到serialization
隔离级别的效果
观点:
- 所有写事务需要将读的数据全部缓存起来,进行比对,消耗必然非常大。
- 事务回滚率必然很多,与其造成大量回滚,可能效率不如直接串行化。