今回は、Silverの「開発/SQL - トランザクション」からの出題です。
クライアントAは行Xを更新するために行ロックを取得した。
クライアントBはこれと異なる行Yを更新したいが、YがたまたまXと同じデータブロックにあったので、行ロックは取得できず、クライアントAの処理が終わるまで待たされた。
クライアントAはテーブルTのすべての行を独占的に更新するため
LOCK TABLE T;
により、ACCESS EXCLUSIVEモードでのロックを取得した。
このロックが解放されるまで、クライアントBはテーブルTを更新できないが、SELECTだけなら実行できる。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2012年10月11日
データベースでは、複数のクライアントによるデータの同時更新を制御するためロックの機能があります。更新に先立ち、データのロックを取得しますが、ロックが取得できないときはロックが取得できるまで待つことになります(コマンドの種類によってはロック解放を待たずにエラーとして終了します)。
通常のUPDATE/DELETE/INSERTによる更新では、行単位でデータがロックされます。データベースの種類によっては、ロックの最小単位がページ単位だったり、あるいは多数の行のロックを取得すると、ロックエスカレーションを起こしてページロックやテーブルロックに移行してしまうものもありますが、PostgreSQLの行ロックには行数制限などはありません。つまり、他人がロックしているのと同じ行は更新できませんが別の行であれば更新できます。
行ロックとは別に、テーブルロックの機能もあります。テーブルロックには様々なモードがあり、モードの種類によって、他の種類のロックと共存できたりできなかったりしますが、デフォルトのACCESS EXCLUSIVEモードでのロックでは、他のクライアントからは参照のみのSELECTも含め、一切、アクセスできなくなります。逆に、他のクライアントが1行でもデータをロックしていると、ACCESS EXCLUSIVEモードでのテーブルロックは取得できません。
従って、正解は A と E です。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.