0

我正在使用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在同一个事务中的同一张表中两次时会发生什么?第一个锁会被释放吗?我已经看到证据表明情况确实如此,但我无法完全弄清楚如何确认。

4

2 回答 2

1

锁仅在提交或回滚时释放。另一方面,单个事务永远不会为自己阻塞。所以上面应该没问题,只要只有一个线程在做。

如果不止一个线程在上面运行,我担心你会死锁。如果需要,您将需要一个同时锁定两个集合的 SQL 语句,例如上面 Jaydee 的回答。

于 2011-12-07T06:31:29.023 回答
0

像这样的东西怎么样

SELECT * FROM mytable WHERE attribute1 = 'something' 
    or attribute2 = 'somethingelse' FOR UPDATE

UPDATE mytable SET  attribute2 = 'somethingnew' WHERE somethingelse

我不直接知道您的问题的答案,但是 MySQL 手册说在事务完成(提交或回滚)时锁定释放,这意味着第二次选择不会释放锁定。在您的情况下,您实际上不需要两个选择。

于 2010-12-15T15:00:16.757 回答