避免MySql中错误写入的可能方法

避免MySql中错误写入的可能方法,mysql,transactions,isolation-level,Mysql,Transactions,Isolation Level,假设我们有一笔交易- 交易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'; 上述事

假设我们有一笔交易-

交易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

因此,在上面的场景中,如果发生了来自
T1
S1
,然后发生了来自
T2
S3
,然后来自
T1
S2
,那么它将是错误的,因为在执行S3之后,colA的值是
A2
,所以我不希望S2成功

我怎样才能避免这种情况

可能的解决方案-

  • 使用乐观/悲观锁定:只有在没有其他选项可用的情况下,我才会这样做
  • 使用SELECT进行更新:比如
    更新表A集合colB='B1',其中id='id1'和colA='A1'
  • 使用事务隔离级别
    SERIALIZABLE
  • 我能用3实现我想要的吗?在这两个选项中,哪一个更好?

    我想将colB改为B1,前提是colA值为A1

    然后在WHERE子句中加入这一部分

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

    是的,我想问,我是否可以将事务隔离级别设置为
    可序列化
    ,并实现它?