トランザクションとACIDの試験問題への適用
複数トランザクションと部分取消しの値を追い、読取りの異常を時系列から分類します。制約、再試行、外部連携の適用範囲も事例で判断します。
この単元で学ぶこと
- 業務上の一まとまりからトランザクションの境界を決める
- COMMITとROLLBACKを区別し、更新後の値を求める
- ACIDの各性質と守る対象を説明する
- 同時実行と障害復旧で必要な条件を見分ける
本文解説
同一処理と別処理を区切る 初期x=100からT1で20加算して確定し、別のT2で30減算して取り消すとx=120です。T2の開始値はT1を反映した120なので、T2の取消しで100には戻りません。一つのトランザクション内で両更新を行って全体を取り消す場合との違いを、開始・確定の境界で判断します。
途中地点へ戻してから続ける x=100でBEGINし、20加算してSAVEPOINT sを作り、30減算したとします。ROLLBACK TO sで120へ戻し、さらに5加算してCOMMITすると125です。sより前の更新は残り、sより後の取り消した更新は残りません。セーブポイントは途中結果の確定ではないので、最後に全体を取り消せば100へ戻ります。
未確定値と確定済み値の違い T1が価格を100から120へ変えて未確定の間にT2が120を読むのはダーティリードです。T1がその後取り消せば、T2は成立しなかった値を使ってしまいます。一方、価格100を読んだ処理が、他のコミット後に再読して120を得るのはノンリピータブルリードです。「他が確定したか」と「何回読んだか」を分けます。
行集合が変わる例 価格100以下の検索結果が2行あり、他の処理が価格80の行を挿入して確定したとします。同じトランザクションで再検索して3行を得ればファントムリードです。表示順だけが変わった場合とは違います。検索条件に該当する集合が変わったという現象に注目します。
直列化可能かを判断する T1とT2だけなら、直列順序の候補はT1→T2とT2→T1です。同時実行の結果がどちらとも等価でなければ、直列化可能とはいえません。処理の開始時刻や所要時間で判断するのではありません。Serializableでは保証を守るため中断が起こり得るので、仕様に従って読取りを含む業務単位を再試行する設計を用意します。
制約が防ぐこと、防がないこと 残高を負にしないCHECK制約は、それに反する更新を拒否できます。ただしその制約だけでは送金先の入力ミスは判定できません。また原子性は複数の更新を一体として扱う性質なので、誤った計算式を自動修正する意味ではありません。問題の事象に直接対応する性質を、全部か無か・制約・干渉・確定後の保持に分けます。
確定後と確定前の障害 確定成功後の電源断でも売上を保持したいなら耐久性が中心です。処理の途中で中断したとき片側の更新だけ残したくないなら原子性が中心です。実装ではログなど同じ仕組みが複数の性質を支える場合がありますが、問われる要件を区別します。壊れた保存装置しか情報がなければ、命令名だけで復旧できるわけではありません。
DBの外側までを考える 在庫更新のトランザクションを取り消しても、別サービスですでに成功した決済が自動返金されるとは限りません。成否確認、再試行、補償処理などを連携として設計します。途中でCOMMITを置いたDB更新も、それ以降のROLLBACKでは戻せません。設問では対象システムと確定済み範囲を先に書き出します。
図解
重要ポイント
- 更新を一体にする範囲と、確定・取消しの境界を先に確認する。
- ACIDは原子性・一貫性・独立性・耐久性で、守る対象が異なる。
- 制約、競合制御、障害復旧、外部連携もそれぞれ設計する。
間違えやすい点
- COMMIT済みの別トランザクションまでROLLBACKで戻ると考えない。
- 原子性を、すべての命令が物理的に同時実行される意味にしない。
- 単一DBの取消しで外部メールや決済も自動取消しされると考えない。
用語解説
- トランザクション
- 関連する処理を一つの確定・取消しの単位として扱うもの。
- コミット
- トランザクションの更新を正常終了として確定する操作。
- ロールバック
- 対象の未確定更新を取り消す操作。通常の全体取消しとセーブポイントへの部分取消しを区別する。
- 原子性
- 一式の更新を全部確定するか、全部取り消すかにそろえる性質。
- 一貫性
- 定めた整合性条件を満たす状態を処理の前後で維持する性質。
- 独立性
- 並行して進むトランザクション間の干渉を制御する性質。分離性ともいう。
- 耐久性
- コミットした結果を後の障害でも保持する性質。永続性ともいう。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
- https://www.ipa.go.jp/shiken/syllabus/gaiyou.html
- https://www.postgresql.org/docs/18/tutorial-transactions.html
- https://www.postgresql.org/docs/18/transaction-iso.html
- https://www.postgresql.org/docs/18/ddl-constraints.html
- https://www.postgresql.org/docs/18/sql-rollback.html
- https://www.sqlite.org/lang_transaction.html
- https://www.sqlite.org/atomiccommit.html
確認問題の出題・採点や学習履歴の保存にはログインが必要です。