在 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成功。
我怎样才能避免这种情况?
可能的解决方案-
- 使用乐观/悲观锁定:我会选择这个,只有在没有其他选择有效的情况下
- 使用 SELECT 进行更新:喜欢
update table A set colB = 'B1' where id = 'id1' and colA = 'A1'
- 使用事务隔离级别
SERIALIZABLE
我可以使用 3 实现我想要的吗?这两个哪个更好?
我想把colB改成B1,前提是colA的值为A1
然后将那部分作为 WHERE 子句
update table A
set colB = 'B1'
where id = 'id1'
AND 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
所以,在上面的场景中,如果 S1
from T1
发生,然后 S3
from T2
发生,那么 S2
from T1
,那就错了,因为S3执行后,colA的值为A2
,所以我不希望S2成功。
我怎样才能避免这种情况?
可能的解决方案-
- 使用乐观/悲观锁定:我会选择这个,只有在没有其他选择有效的情况下
- 使用 SELECT 进行更新:喜欢
update table A set colB = 'B1' where id = 'id1' and colA = 'A1'
- 使用事务隔离级别
SERIALIZABLE
我可以使用 3 实现我想要的吗?这两个哪个更好?
我想把colB改成B1,前提是colA的值为A1
然后将那部分作为 WHERE 子句
update table A
set colB = 'B1'
where id = 'id1'
AND colA = 'A1'