ホーム > データベーススペシャリスト試験 > 2022年
データベーススペシャリスト試験 2022年 午前2 問14
トランザクションT1がある行Xを読んだ後, 別のトランザクションT2が行Xの値を更新してコミットし, 再びT1が行Xを読むと, 以前読んだ値と異なる値が得られた。この現象を回避するSQLの隔離性水準のうち, 最も水準の低いものはどれか。
ア:READ COMMITTED
イ:READ UNCOMMITTED
ウ:REPEATABLE READ(正解)
エ:SERIALIZABLE
解説
トランザクションの隔離性水準に関する問題【午前2 解説】
要点まとめ
- 結論:トランザクションT1が同じ行を複数回読んでも値が変わらないのはREPEATABLE READの隔離レベルである。
- 根拠:READ UNCOMMITTEDやREAD COMMITTEDでは他トランザクションの更新が反映されるため、値が変わる可能性がある。
- 差がつくポイント:更新済みのデータを再読取時に変化させないことがREPEATABLE READの特徴であり、これが問題文の現象回避に最適である。
正解の理由
問題文の状況は、T1が行Xを読み、その後T2が行Xを更新・コミットし、再度T1が行Xを読むと値が変わっているというものです。
この現象は「非リピータブルリード」と呼ばれ、同一トランザクション内で同じデータを複数回読んだ際に値が変わる問題です。
この問題を防ぐためには、同じトランザクション内で読み取ったデータの値が変わらないようにする隔離レベルが必要です。
それがREPEATABLE READであり、これによりT1は最初に読んだ値を再度読んでも同じ値を得られます。
したがって、正解はウ: REPEATABLE READです。
この現象は「非リピータブルリード」と呼ばれ、同一トランザクション内で同じデータを複数回読んだ際に値が変わる問題です。
この問題を防ぐためには、同じトランザクション内で読み取ったデータの値が変わらないようにする隔離レベルが必要です。
それがREPEATABLE READであり、これによりT1は最初に読んだ値を再度読んでも同じ値を得られます。
したがって、正解はウ: REPEATABLE READです。
よくある誤解
READ COMMITTEDはコミット済みのデータのみを読むため一見安全に見えますが、再読時に値が変わる可能性があり非リピータブルリードを防げません。
READ UNCOMMITTEDは最も低い隔離レベルで、ダーティリードも発生するため問題の現象を回避できません。
READ UNCOMMITTEDは最も低い隔離レベルで、ダーティリードも発生するため問題の現象を回避できません。
解法ステップ
- 問題文の現象を理解する(同一トランザクション内での値の変化)。
- それが「非リピータブルリード」と呼ばれる問題であることを確認。
- 各隔離レベルの特徴を整理する。
- 非リピータブルリードを防止できる隔離レベルを選ぶ。
- REPEATABLE READが該当するため正解と判断する。
選択肢別の誤答解説
- ア: READ COMMITTED
コミット済みデータのみ読み取るが、再読時に他トランザクションの更新が反映されるため非リピータブルリードを防げない。 - イ: READ UNCOMMITTED
最も低い隔離レベルで、未コミットのデータも読み取るためダーティリードが発生し問題の現象を回避できない。 - ウ: REPEATABLE READ
同一トランザクション内での複数回の読み取りで値が変わらないため非リピータブルリードを防止できる。 - エ: SERIALIZABLE
最も高い隔離レベルで、すべての問題を防止できるが問題文の「最も水準の低いもの」ではない。
補足コラム
SQLの隔離性水準はANSI/ISO SQL標準で定義され、主に4段階あります。
- READ UNCOMMITTED(最も低い)
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE(最も高い)
REPEATABLE READは非リピータブルリードを防ぎますが、ファントムリード(新しい行の挿入による影響)は防げない場合があります。
ファントムリードも防ぎたい場合はSERIALIZABLEを選択します。
FAQ
Q: READ COMMITTEDとREPEATABLE READの違いは何ですか?
A: READ COMMITTEDはコミット済みデータのみ読みますが、再読時に値が変わる可能性があります。REPEATABLE READは同一トランザクション内での再読時に値が変わらないことを保証します。
A: READ COMMITTEDはコミット済みデータのみ読みますが、再読時に値が変わる可能性があります。REPEATABLE READは同一トランザクション内での再読時に値が変わらないことを保証します。
Q: SERIALIZABLEはなぜ最も高い隔離レベルですか?
A: SERIALIZABLEはトランザクションを完全に直列化し、すべての競合を防止するため、データの一貫性を最も強く保証します。
A: SERIALIZABLEはトランザクションを完全に直列化し、すべての競合を防止するため、データの一貫性を最も強く保証します。
関連キーワード: トランザクション, 隔離性水準, 非リピータブルリード, SQL, データベース, ACID特性