今回は、Silverの「開発/SQL - トランザクションの概念(LOCK文)」からの出題です。
SELECT * FROM sample;
SELECT * FROM sample WHERE id = 1 FOR UPDATE;
UPDATE sample SET val = 'x';
UPDATE sample SET val = 'x' WHERE id = 2;
LOCK TABLE sample;
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2018年10月30日
SELECT文の終わりに FOR UPDATE をつけると、SELECTが返す行を表示する通常の動作に加えて、それらの行のロックを取得します。行のロックを保持している間は、他のトランザクションがその行に対して更新や削除などの操作をすることができなくなります。なお、SELECTが複数の行が返された場合はそのすべてをロックしますが、返されなかった行についてはロックしません。行のロックが取得できなかった場合は、ロックが解放されるまで待たされる、つまりロック待ちの状態になります。
では、選択肢のSQLを順に見ていきましょう。
Aはロックされた行をSELECTしますが、FOR UPDATE句がありませんから、行ロックを取得しません。したがってロック待ちにはなりません。
Bはロックされているのと同じ行について、行ロックを取得しようとしています。そのためロック待ちになります。
Cはすべての行のval列を更新しようとしていますが、id=1の行について行ロックが取得できず、ロック待ちになります。
Dはid=2の行を更新しようとしていますが、この行はロックされていないので、問題なく更新できます。
Eはテーブル全体をロックしようとしていますが、テーブルロックと行ロックは競合するため、ロック待ちになります。
したがって正解はB、C、Eです。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.