我在 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;
根据这个网页,
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
此外,是否可以通过执行 a而不是事务来解决此问题(并且仍然实现行锁定对作业队列的效果) ?
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1