写倾斜
写倾斜
举一个例子,现在有两个医生在值班,医院的规定是如果当前有两个医生在值班,那么就有一个医生可以暂时离开。如果这两个医生同时点击申请离开,会开启两个事务,两个事务会先判断是否有两个医生在值班,因为两个事务同时执行,暂时不考虑隔离性,那么两个事务判断都满足条件,然后进入下一阶段,医生离开,减少当前医生数量,然后医生数量就变为0。这显然不满足需求。
这既不是一种脏读,也不是更新丢失,两笔事务更新的是两个不同的对象(两个医生的值班状态)。
根据可串行化定义,多个事务并行执行,他们的结果与事务串行执行的要一致,可以发现事务并没有达到穿行的效果。
可以说,写倾斜是一种不易察觉到的更新丢失,或者将写倾斜定义为一种更广义的数据更新丢失问题。
即如果两个事务读取相同的一组对象,然后更新其中一部分:不同的事务更新不同的对象,则可能发生写倾斜。而不同的事务如果更新的是同一个对象,则可能发生脏写或更新丢失。
可以发现,首先他会查询一些数据(需要满足一定的条件),暂定为数据集A,然后根据这些数据去做下一步的操作。
我们根据数据集A去做一些判断,然后执行后续的操作。
在第二步判断成功后,有一些操作修改了数据集A里面的内容,导致了他不再满足第二步的判断,但此时第二步的判断已经结束了,开始执行后续的逻辑,就发生了写倾斜。
即发生写倾斜是因为后续的操作改变了满足之前查询结果的数据,或者使得之前的数据不满足曾经的判断条件,导致了写倾斜。