Nyx*_*nyx 5 php mysql sql rabbitmq
我在MySQL中使用行锁定(事务)来创建作业队列.使用的引擎是InnoDB.
SQL查询
START TRANSACTION;
SELECT *
FROM mytable
WHERE status IS NULL
ORDER BY timestamp DESC LIMIT 1
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
根据这个网页,
The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for all of the worker processes, and you see a lot of processes waiting for the locks to be released with COMMIT.
问题:这是否意味着当执行第一个查询时,这需要一些时间才能完成事务,当第二个类似查询在第一个事务提交之前发生时,它将不得不等待它在执行查询之前完成?如果这是真的,那么我不明白为什么单行的行锁定(我假设)将影响下一个不需要读取该锁定行的事务查询?
此外,通过执行UPDATE
而不是事务,是否可以解决此问题(并且仍然实现行锁定对作业队列的影响)?
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
如果将 FORUPDATE
与使用页锁或行锁的存储引擎一起使用,则查询检查的行将被写入锁定,直到当前事务结束。使用LOCK IN SHARE MODE
设置共享锁,允许其他事务读取已检查的行,但不允许读取update or delete
它们。以及关于此查询
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
自从innodb
在处理SQL语句期间自动获取锁我认为它的工作原理是一样的。