PREPARATION
受験対策

Silverの例題解説「開発/SQL - トランザクションの概念(LOCK文)」

今回は、Silverの「開発/SQL - トランザクションの概念(LOCK文)からの出題です。

例題

3.92

テーブルsampleにおいて、列idは整数型の主キー、列valはtext型である。
あるトランザクションから

SELECT * FROM sample WHERE id = 1 FOR UPDATE;

を実行した。
別のトランザクションから実行したときにロック待ちになるSQL文をすべて選びなさい。

  1. SELECT * FROM sample;

  2. SELECT * FROM sample WHERE id = 1 FOR UPDATE;

  3. UPDATE sample SET val = 'x';

  4. UPDATE sample SET val = 'x' WHERE id = 2;

  5. 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事務局ではお応えできませんのでご了解ください。

企業の基幹システムや業務システムでの
OSS-DBの採用がますます拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定資格になります

OSS-DBの受験対策について

受験の学習をサポートする情報や対策に役立つ情報をご紹介

サンプル問題/例題解説

例題 のアーカイブを試験ごとにまとめています。OSS-DB技術者認定試験の学習にお役立てください

学習教材・教育機関のご紹介

OSS-DB認定教材や教育機関について詳しくご説明いたします。

無料技術解説セミナー

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

OSS-DB道場

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

LPI-Japan
Platinum Sponsors