SQLのfor updateは行レベルでテーブルをロックする トランザクションで有効
  • facebookページ
  • twitterページ
  • 2020.04.29

    SQLのfor updateは行レベルでテーブルをロックする トランザクションで有効

    SQLのfor updateについてまとめています。実際にロックする様子を解説。

    for updateは、行レベルでテーブルをロックするSQL

    select文にfor updateをつけて実行すると、更新行のみの行ロックをかけることができます。

    以下は、MySQLのサンプルデータベースemployeesを使って行ロックをかけるサンプルSQLです。

    beginでトランザクションを開始したあとに、selectにfor update指定をすることで、行ロックが発生します。

    上記のSQLはそのままで、別のセッションを開いて、行ロックが発生していることを確かめてみましょう。

    ロックがかかっている行のみ、for updateをつけて実行すると待ちが発生します。(一定時間でタイムアウトになります)なお、単純なselectだと、問題なく実行できました。

    select文の条件を変えて、別の行をfor update指定つきでselectすると、実行できました。

    for updateは、複数テーブルの値をもとに、矛盾なくSQLを実行したい場合に使います。

    一部のデータベースでは、for updateを利用できない

    主要データベースのうち、MySQL、Oracle、PostgreSQLはfor updateが使えます。SQL Serverにはfor updateの指定がありません。

    SQL Serverでは、from後のテーブル指定に、テーブルヒントとしてrowlockを指定することで行単位のロックをかけることができます。

    参考)テーブル ヒント (Transact-SQL) – SQL Server | Microsoft Docs

    まとめ

    ポテパンダの一言メモ
    • selectにfor update指定すると、行ロックをかけることができる
    • begin内のトランザクション中でのみ有効
    • 別セッション中のSQLで、ロック中の行を更新またはロックしようとすると待ち状態になる


    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE