PREPARATION
受験対策

Silverの例題解説「開発/SQL - トランザクションの概念(トランザクション分離レベル)」

今回は、Silverの「開発/SQL - トランザクションの概念(トランザクション分離レベル)」からの出題です。

例題

3.73

PostgreSQLのトランザクション分離レベルの説明として、適切なものを2つ選びなさい。

  1. Read Uncommittedでは、他のトランザクションが更新した後、まだcommitしていないデータを読めてしまう。

  2. Read Committedでは、トランザクション内で同じSELECT文を2回続けて実行しても、異なる結果が返されることがある。

  3. Repeatable Readでは、トランザクション内で同じSELECT文を2回続けて実行したら、必ず同じ結果が返される。

  4. Serializableは読み取りトランザクション専用の分離レベルである。

※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2017年4月3日

解答と解説

標準SQLでは、制約の弱いものから順にRead Uncommitted、Read Committed、Repeatable Read、Serializableの4つのレベルのトランザクション分離レベルを定めています。

PostgreSQLでは、このいずれの分離レベルでも宣言できますが、Read Uncommittedと宣言してもRead Committedの動作になります(指定より強い分離レベルで動作することは、標準SQLで許容されています)。

一般に、Read Uncommittedでは、他のトランザクションが更新した後、まだcommitされていないデータが読めてしまいます(ダーティーリード)が、PostgreSQLではRead Committedとして動作するので、ダーティーリードは発生しません。

Read Committedでは、トランザクション内の各SQLは、それを実行する時点でcommitされているデータを参照します。従って、同じSELECTを2回続けて実行しても、その間に他のトランザクションがデータ更新をcommitした場合、異なる結果が得られます。

Repeatable Readでは、トランザクション開始時のスナップショットに基づいてSQLが実行されるため、同じSELECT文を2回続けて実行すると、必ず同じ結果になります。

標準SQLトランザクション分離レベルのRepeatable Readでは、ファントムリードの可能性がありますが、PostgreSQLのRepeatable Readはファントムリードが起こらない実装になっています。

Serializableは最も強い分離レベルで、読み取り専用のトランザクションで使用すると他のトランザクションを同時に実行していてもその影響を受けないという利点がある一方、更新トランザクションで使用すると他のトランザクションとの競合により思わぬエラーによるロールバックが発生し、トランザクションを再実行しなければならないことがあるので、注意が必要です。しかし、目的に応じて更新トランザクションでもSerializableを使用することは可能なので、適切に分離レベルを選択してください。

従って、正解はBとCです。

今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。

※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。

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

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

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

サンプル問題/例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

LPI-Japan
Platinum Sponsors