pulpul 日本の試験

データベーススペシャリスト 概念書 · データベース

トランザクション処理

要点と定義

トランザクションは、ひとまとまりとして実行・確定する処理です。ACIDの原子性は全処理の実行か全処理の取消し、一貫性は処理の前後で整合性制約を保つこと、隔離性は同時実行の干渉を抑えること、耐久性はコミットした結果を障害後も保つことを表します。一貫性は処理の正しさを自動で保証するものではなく、適切な制約や処理手順が前提です。この四つを区別すると、求められる保証を判断できます。

同時実行されたトランザクションの結果が逐次実行の結果と等価になる性質を、直列化可能性といいます。この用語の定義は、過去の出題で扱った補足です。試験要綱Ver.5.6のこの節に明記された項目としてではなく、同時実行制御を考える際の補助概念として押さえます。

共有ロックは読み取り同士の共有を許し、専有ロックは他のアクセスと競合します。同じ対象では共有ロック同士は両立しますが、少なくとも一方が専有ロックなら待ちが生じます。行や表などロック粒度が異なる場合は、階層上の意図ロックも含めて競合を判定します。たとえば、ある行に共有ロックがあるとき、同じ表全体への専有ロックは意図ロックを介して競合します。

検索条件に合う行が別のトランザクションのコミット後に増減し、同じ条件で再検索したときの行集合が変わる現象はファントムリードです。既存行の値が変わる現象とは区別します。どの現象が起こり得るかは、隔離性水準やDBMSの実装に依存します。

適用条件と例

ロックを待つ処理が互いに相手のロック解放を待つ循環をつくると、デッドロックです。たとえば処理Aが商品行を保持して注文行を待ち、処理Bが注文行を保持して商品行を待つと、互いに相手の処理が保持するロックを待つ循環が成立します。単に一方がロックを待っているだけでは、まだデッドロックとは判断できません。

障害回復用のログには、更新前情報と更新後情報を記録できます。ロールバックでは更新前情報を使って変更を戻し、バックアップ復元後のロールフォワードでは更新後情報を使って変更を再反映します。たとえば在庫数の更新を取り消すなら更新前の状態に戻し、障害直前までの更新を復元するなら更新後の状態を反映します。記録形式や具体的な回復手順はDBMSによって異なります。

分散トランザクションの2相コミットメントでは、参加サイトが処理を確定できる準備状態かを確認してから、主サイトが全体の決定を通知します。通知が届かない参加サイトは、コミットかロールバックかを判断できず待機する場合があります。各サイトが独自に確定すると結果が食い違い得るため、全体の決定をそろえる制御が必要です。

この節の続き

ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。

アプリでこの節を読む