Mysql 锁定同一张表两次

Mysql 锁定同一张表两次,mysql,transactions,isolation-level,Mysql,Transactions,Isolation Level,我正在使用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 somethi

我正在使用
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 * FROM mytable WHERE attribute1 = 'something' 
    or attribute2 = 'somethingelse' FOR UPDATE

UPDATE mytable SET  attribute2 = 'somethingnew' WHERE somethingelse

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

锁仅在提交或回滚时释放。另一方面,单个事务本身永远不会阻塞。因此,只要只有一个线程在执行上述操作,上述操作就可以了


如果有多个线程在运行上述线程,我担心您可能会死锁。如果需要,您需要一条SQL语句同时锁定两个集合,如上面Jaydee的回答。

在发出SELECTs之前,您是否将autocommit设置为0或启动事务?