1

我想执行这段代码:这个想法是获取最低MID的未使用项目(mutex = 0)。为了防止其他线程读取此行FOR UPDATE,使用并UPDATE减少mutex

START TRANSACTION;
SELECT MID as m, sender, receiver, content FROM queue WHERE mutex = 0 ORDER BY MID ASC limit 1 FOR UPDATE; 
UPDATE queue set mutex = -1 WHERE MID = m;
COMMIT;

但是,仅在执行该行m时才知道。SELECT如何在下一个查询中访问它,而不破坏查询,这将停止TRANSACTION

PS:我知道互斥锁不是我使用它的东西。

4

1 回答 1

1

你可以使用一个变量:

START TRANSACTION;
SELECT @m:=MID, sender, receiver, content FROM queue WHERE mutex = 0 ORDER BY MID ASC limit 1 FOR UPDATE; 
UPDATE queue set mutex = -1 WHERE MID = @m;
COMMIT;
于 2013-03-16T17:11:33.080 回答