HOME > 受験対策 > サンプル問題/例題解説 > Silverの例題解説「 開発/SQL」 > トランザクションの概念(行ロックとテーブルロック)

Silverの例題解説「 開発/SQL - トランザクションの概念(行ロックとテーブルロック)」

今回は、Silverの「 開発/SQL - トランザクションの概念(行ロックとテーブルロック)」からの出題です。

例題

Q. テーブルsampleにおいて、列idは整数型の主キー、列valはtext型である。
あるトランザクションから
SELECT * FROM sample WHERE id = 1 FOR UPDATE;
を実行した。
別のトランザクションから実行したときにロック待ちになるSQL文をすべて選びなさい。
  1. A. SELECT * FROM sample;
  2. B. SELECT * FROM sample WHERE id = 1 FOR UPDATE;
  3. C. UPDATE sample SET val = 'x';
  4. D. UPDATE sample SET val = 'x' WHERE id = 2;
  5. E. 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事務局ではお応えできませんのでご了解ください。

ページトップへ