在 MySql 中避免 BAD WRITES 的可能方法

Possible ways to avoid BAD WRITES in MySql

假设我们有一笔交易 -

事务 T1

S1=>   id1 = select id, colA, colB, colC from table A where colA = 'A1';

S2=>   update table A set colB = 'B1' where id = 'id1'

以上,我想把colB改成B1,只有当colA的值为A1

事务 T2

 S3=>  update  table A set colA = 'A2' where colA = 'A1';

上述交易将 colA 值设置为 A2

所以,在上面的场景中,如果 S1 from T1 发生,然后 S3 from T2 发生,那么 S2 from T1,那就错了,因为S3执行后,colA的值为A2,所以我不希望S2成功。

我怎样才能避免这种情况?

可能的解决方案-

  1. 使用乐观/悲观锁定:我会选择这个,只有在没有其他选择有效的情况下
  2. 使用 SELECT 进行更新:喜欢 update table A set colB = 'B1' where id = 'id1' and colA = 'A1'
  3. 使用事务隔离级别SERIALIZABLE

我可以使用 3 实现我想要的吗?这两个哪个更好?

我想把colB改成B1,前提是colA的值为A1

然后将那部分作为 WHERE 子句

update table A 
    set colB = 'B1' 
where id = 'id1'
AND colA = 'A1'