我正在使用SELECT...FOR UPDATE
查询来锁定表格。不幸的是,我需要在同一个表中锁定两组不同的行,如下所示:
SELECT * FROM mytable WHERE attribute1 = 'something' FOR UPDATE
SELECT * FROM mytable WHERE attribute2 = 'somethingelse' FOR UPDATE
UPDATE mytable SET attribute2 = 'somethingnew' WHERE somethingelse
我需要锁定两组行。我正在做的是,确保表中没有任何对象处于特定状态,然后找到可以放入该状态并将它们放在那里的其他对象。目标是满足某些过于复杂而无法编码到mysql中的约束。
所以...问题是,当我SELECT...FOR UPDATE
两次来自同一交易中的同一张桌子时会发生什么?第一个锁是否被释放?我已经看到证据证明是这种情况,但我无法弄清楚如何确认。
答案 0 :(得分:0)
像
这样的东西SELECT * FROM mytable WHERE attribute1 = 'something'
or attribute2 = 'somethingelse' FOR UPDATE
UPDATE mytable SET attribute2 = 'somethingnew' WHERE somethingelse
我不直接知道您的问题的答案,但MySQL手册说当事务完成时锁定释放(Commited或Rolled back),这意味着第二个选择不释放锁。在您的情况下,您实际上不需要两个选择。
答案 1 :(得分:0)
锁仅在提交或回滚时释放。另一方面,单个事务从不阻止自身。所以上面应该没问题,只要只有一个线程就可以了。
如果上面运行了多个线程,我担心你会死锁。如果你想要,你需要一个单独的SQL语句来锁定两个集合,例如, Jaydee的回答是上面的。