【发布时间】: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成功。
我怎样才能避免这种情况?
可能的解决方案 -
- 使用乐观/悲观锁定:只有在没有其他选项有效的情况下,我才会这样做
- 使用 SELECT 进行更新:像
update table A set colB = 'B1' where id = 'id1' and colA = 'A1' - 使用事务隔离级别
SERIALIZABLE
我可以使用 3 实现我想要的吗?这两个哪个更好?
【问题讨论】:
标签: mysql transactions isolation-level