sql >> データベース >  >> RDS >> Mysql

Mysql selectforupdate-ターゲット行をロックしていません。どうすればそれが確実に行われるのですか?

    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を確認してください 更新クエリが実行されたことがわかります(タイムアウトしなかった場合)。




    1. mysqlクエリの列名として変数を使用する

    2. MySQL浮動小数点比較の問題

    3. Oracleで休止状態:StringプロパティをCLOB列にマッピング

    4. mysqlの単一のクエリで子カテゴリの親名を取得する