SELECT FOR UPDATE
作成したトランザクションが終了するまで、更新用に選択した行をロックします。他のトランザクションはその行のみを読み取ることができますが、更新トランザクションの選択が開いている限り、その行を更新することはできません。
行をロックするには:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
上記のトランザクションは有効であり、コミットされるまで行をロックします。
それをテストするために、さまざまな方法があります。 MySQLクライアントをそれぞれで開いた状態で2つのターミナルインスタンスを使用してテストしました。
first terminal
SQLを実行します:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
second terminal
行の更新を試みることができます:
UPDATE test SET parent = 100 WHERE id = 4;
first terminal
で更新用の選択を作成するため 上記のクエリは、更新トランザクションの選択がコミットされるか、タイムアウトになるまで待機します。
first terminal
に戻ります トランザクションをコミットします:
COMMIT;
second terminal
を確認してください 更新クエリが実行されたことがわかります(タイムアウトしなかった場合)。