【问题标题】:Possible ways to avoid BAD WRITES in MySql在 MySql 中避免 BAD WRITES 的可能方法
【发布时间】:2020-09-19 19:59:24
【问题描述】:

假设我们有一个交易 -

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

Above Transaction 将colA 的值设置为A2

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

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

可能的解决方案 -

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

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

【问题讨论】:

    标签: mysql transactions isolation-level


    【解决方案1】:

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

    然后将其作为 WHERE 子句的一部分

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

    【讨论】:

    • 是的,想问一下,能不能把事务隔离级别设为SERIALIZABLE也能实现?
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多