IPA トランザクション・同時実行制御 — 頻出論点と過去問

頻出論点

1. この分野は何か

データベースに対する不可分な一連の処理のまとまりであるトランザクションについて、複数の処理を同時に実行してもデータの整合性を保ちながら効率よくさばくための制御の仕組みを扱う分野です。確定前の更新を他方が読むのか、読み直す間に値や行数が変わるのかといった事象の違いと、ロックの待ち合いがどの範囲の処理を止めるかが判断の軸になります。

2. 実際の出題のされ方

一連の処理がすべて完了したときに変更を確定する操作の名称や、トランザクションの定義、満たすべき4つの性質が繰り返し出題されています。これらはITパスポートから応用情報技術者の午前まで問われており、応用情報技術者の午前では、4つの性質に含まれない用語を選ばせる問いや、同じデータ項目の異なる版を用意して同時実行性を高める仕組みの名称を問う問題も出ています。

並行実行で起きる事象と隔離性水準の対応は、データベーススペシャリストとシステムアーキテクトの午前IIで踏み込んで問われます。特定の読み取り異状(同じデータを再読込した際に他方の更新によって値が変わる現象など)を回避できる最も低い隔離性水準を選ぶ問題や、隔離性水準を高めたときに不整合なデータを読み込む数と単位時間に処理できる数がそれぞれ増減どちらになるかの組合せを選ぶ問題が出題されています。さらに、有向グラフから永久待ちの状態にあるトランザクションをすべて列挙する問題や、時系列の操作スケジュールから待ち状態のグラフの空欄を特定する問題も出されています。

同じデータを同時に更新しても矛盾を生じさせない技法の名前や、2相ロッキングで起こり得る現象を選ばせる問題が、ITサービスマネージャの午前IIにあります。デッドロックを避けるバッチ処理の設計指針は、情報処理安全確保支援士の午前IIにも出ています。

2相ロック方式でロックを解除できるタイミングや、単版の2相ロックと多版同時実行制御とで未確定の更新を参照したときの振る舞いを比べる問題は、データベーススペシャリストの午前IIで出題されています。

3. 学習のポイント

トランザクションが備えるべきACID特性の4つと、スケジュールの性質である直列化可能性(シリアライザビリティ)の定義を混同しないように整理します。

  • 原子性(Atomicity): トランザクションの中の更新が、すべて反映されて確定(コミット)するか、取り消されて(ロールバック)1つも反映されないかのどちらかになり、途中までの状態が残らない性質です。
  • 一貫性(Consistency): トランザクションの前後で、定めた制約を満たしたデータの状態が保たれる性質です。
  • 独立性・隔離性(Isolation): 実行中のほかのトランザクションの途中の結果に影響されず、それぞれが単独で動いたときと同じ結果になる性質です。複数のトランザクションを並行して動かした結果が、どれかの順に1つずつ動かした結果と同じになるとき、その実行のしかたは直列化可能であるといい、独立性が保たれているかを確かめる基準として使います。
  • 耐久性(Durability): コミットした更新は、そのあとに障害が起きても失われない性質です。

同時実行時に発生する異状(アノマリ)は、何が変わるかで区別します。ダーティリードは、まだ確定していない他の更新を読んでしまうこと、ノンリピータブルリードは、同じ行を読み直したら他の確定済みの更新で値が変わっていたこと、ファントムリードは、同じ条件で読み直したら行の集まりそのものが増減していたことです。また、不整合検索異状は、一方が更新している途中のデータを他方が古い値のまま読み、その値をもとに別のデータを書き換えることで、2つのデータの関係が崩れる現象です。

隔離性水準を高めるほど、ロックで待つ時間が長くなり、同時に進められるトランザクションが減ります。

隔離性水準 ダーティリード ノンリピータブルリード ファントムリード
READ UNCOMMITTED 発生する 発生する 発生する
READ COMMITTED 回避できる 発生する 発生する
REPEATABLE READ 回避できる 回避できる 発生する
SERIALIZABLE 回避できる 回避できる 回避できる

データを保護する排他制御では、ロックの種類・粒度・獲得手順と、版を用いた方式の違いを押さえます。

  • 共有ロック(Sロック)と専有ロック(Xロック): 参照時にかける共有ロック同士は競合せず同時に獲得できますが、更新時にかける専有ロックは他の共有ロックとも専有ロックとも競合します。表単位のロックは、その表のすべての行にかけたロックと同じ扱いになるので、どこかの行に競合するロックがあれば獲得できません。
  • 2相ロック方式(2PL): トランザクションはロックを獲得していく段階と解除していく段階を順に通り、いったん解除を始めたら新しいロックを獲得しません。全員がこの規則を守ると、直列化可能性が保証されます。
  • デッドロックの検出と回避: 2相ロック方式では、複数のトランザクションが互いに相手の保持するロックの解放を待ち合うデッドロックが発生し得ます。DBMSはトランザクションを頂点、ロックの待ち状態を有向辺で表した待ちグラフを用い、閉路(サイクル)の有無でデッドロックを検出します。待ちグラフで永久待ちになるのは、閉路の上の頂点と、矢印をたどると閉路に行き着く頂点です。設計で防ぐには、複数のデータにロックをかける順序を決めておき、すべての処理がその順序でロックを取るようにして、待ちの輪ができないようにします。
  • 多版同時実行制御(MVCC): 更新のたびに新しい版を作り、読む側には確定済みの版を見せます。そのため、読む処理と書く処理が互いのロックを待たずに進められます。

4. 間違えやすいところ

  • ACID特性と別のデータベース技術の混同: ACID特性に関する記述を選ぶ問題では、索引による検索の高速化といった、別の技術の説明が誤答肢にありました。検索を速くする仕組みであり、トランザクションの一連の処理を保護する性質ではありません。
  • 直列化可能性とACID特性の各性質の混同: 並行実行の結果が逐次実行の結果と一致する性質を問う問題では、原子性が誤答肢にありました。原子性は1つのトランザクション内の更新がすべて反映されるか全く反映されないかという性質であり、複数トランザクション間の実行順序の等価性を指すものではありません。
  • 2相ロック方式におけるデッドロックの有無: 2相ロック方式ではデッドロックが起きないとする誤答肢がありました。ロックを獲得する段階と解除する段階を分けても、複数のトランザクションが互いに相手のロック解放を待ち合う形は2相ロック方式でも起こり得ます。
  • 多版同時実行制御における版の選択主体: 多版同時実行制御について、読む版をアプリケーションが指定する必要があるとする誤答肢もありました。どの版を参照するかはDBMSが隔離性水準に応じて選ぶため、アプリケーション側で指定する必要はありません。
  • デッドロックを招くバッチ処理の設計: バッチ処理の設計指針を選ぶ問題では、大量のデータをまとめて1つのトランザクションで処理するという誤答肢がありました。ロックを長く持つほど、ほかの処理と待ち合う機会が増えます。

トランザクション・同時実行制御の理解度チェック

トランザクション・同時実行制御の過去問一覧

トランザクション・同時実行制御の用語

データベースのほかの論点

SQL・関係代数53問 データモデル・E-R/UML・キー37問 正規化・関数従属19問 障害回復・バックアップ26問 分散DB・NoSQL18問 インデックス・物理設計11問