Write Skew 我的理解是这样的一个程序:
if (select xxx 满足某个条件 X){
do xxx 让条件 X 不满足;
}
在两个事务里面并发执行,并且在 do 之前条件是满足的。这样 do xxx 可能会执行一次,也可能会是两次。我们的要求是只能执行一次。
对于已存在的行,select 用 FOR UPDATE 可以阻塞住第二个并发的 select,RC 和 RR 都不会出现 Write Skew 问题
对于不存在的行,用 FOR UPDATE 无法挂行锁,RC 级别会出问题。RR 级别有间隙锁,有一些 do xxx 可能会因为间隙锁而造成死锁,最后只能执行一个事务,也可能间隙锁挂的位置不对而没有产生约束力(比如覆盖索引),从而 do 还是执行了两次,是这样的吗?
另外,MySQL 的 串行化 似乎问题也同样存在,而 ddia 里面则说串行化可以解决,是我哪里理解错了?
if (select xxx 满足某个条件 X){
do xxx 让条件 X 不满足;
}
在两个事务里面并发执行,并且在 do 之前条件是满足的。这样 do xxx 可能会执行一次,也可能会是两次。我们的要求是只能执行一次。
对于已存在的行,select 用 FOR UPDATE 可以阻塞住第二个并发的 select,RC 和 RR 都不会出现 Write Skew 问题
对于不存在的行,用 FOR UPDATE 无法挂行锁,RC 级别会出问题。RR 级别有间隙锁,有一些 do xxx 可能会因为间隙锁而造成死锁,最后只能执行一个事务,也可能间隙锁挂的位置不对而没有产生约束力(比如覆盖索引),从而 do 还是执行了两次,是这样的吗?
另外,MySQL 的 串行化 似乎问题也同样存在,而 ddia 里面则说串行化可以解决,是我哪里理解错了?