Tagged: Write Skew

1

Transaction弱隔离之Write Skew和Phantoms

我们在前面的《Transaction弱隔离之读提交的介绍和实现》和《Transaction弱隔离之更新的丢失》中分别介绍了脏写和更新丢失。他们都是有两个写同时发生,从而产生了冲突。那么对于这种情况,我们必然需要进行保护和处理,可以是数据库来自动处理也可以是手动的加一些保护比如锁或者原子写操作等。然而上面提到的两种写冲突就是全部了吗?现实世界显然更加残酷,本文就来具体看看别的冲突的例子。 如下图所示,假设你正在维护一个医院的值班系统,这个系统一般来说会安排几个医生一起来值班,当然它的最低要求是必须有一个医生值班。所以说,当轮到你值班的时候,假如还有别的医生在值班,你就可以从这个系统中请假。请假的操作也很简单,就是假如系统中显示有两个及以上的医生在值班,那么就允许你更新自己的状态成不值班。 现在我们假设Alice和Bob突然同时有事,一个身体不舒服,一个想去和女朋友约会,他们在下班之前的那一刻同时准备到系统中来请假,并且同时执行了请假的操作。然后就有了两个transaction同时执行,他们都是读的snapshot的内容,所以在更新的之前on call count都是大于等于2的,然后他们同时更新了他们自己的状态到请假(on_call...