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.
質問:これは、最初のクエリが実行されると、トランザクションが完了するまでに時間がかかることを意味します。最初のトランザクションがコミットされる前に2番目の同様のクエリが発生すると、クエリが実行される前に、クエリが完了するのを待つ必要があります。 ?これが本当の場合、単一の行の行ロック(私が想定している)が、そのロックされた行を読み取る必要のない次のトランザクションクエリに影響を与える理由がわかりませんか?
UPDATE
さらに、トランザクションの代わりに実行することで、この問題を解決できますか(それでも、ジョブキューに対して行ロックが行う効果を実現できますか?)
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1