AP科目A 15:トランザクション,同時実行制御,障害回復

応用情報技術者試験の科目Aに必要なACIDとCOMMIT/ROLLBACK、S/Xロックとデッドロック、分離レベルと異常現象、WAL・チェックポイント・UNDO/REDOによる障害回復を、追跡例題とオリジナル演習問題5問で学びます。

応用情報技術者試験科目Aデータベーストランザクション排他制御障害回復

AP科目A・第15回 · 2026年度・シラバスVer.7.2に基づく独立した学習資料です。IPAとの提携はなく、合格を保証しません。 シリーズ一覧を見る

学習インデックス

  1. 範囲と用語 · 2. ACIDと境界 · 3. S/Xロック · 4. 異常と分離 · 5. DBMS差 · 6. WALと回復 · 7. 問題 · 8. 復習

1. 範囲と用語

IPA「応用情報技術者試験(レベル3)シラバス Ver.7.2」の大分類3→中分類9 データベース→4. トランザクション処理,(1)同時実行制御,(2)障害回復,(3)トランザクション管理に対応する。位置は PDF 44–45ページ(印刷フッター40–41ページ)。AP14のSQL検索は扱わない。次回のAP16はネットワーク階層,TCP/UDP,ポートを扱い,インデックス,データベース性能,アクセス制御はAP32で扱う。

한국어 日本語 English
트랜잭션 トランザクション transaction
원자성/일관성/격리성/지속성 原子性/一貫性/独立性/耐久性 atomicity/consistency/isolation/durability
공유(S)/배타(X) 잠금 共有(S)/排他(X)ロック shared (S)/exclusive (X) lock
교착 상태 デッドロック deadlock
더티/비반복/팬텀 읽기 ダーティ/反復不能/ファントムリード dirty/non-repeatable/phantom read
미완료/완료 트랜잭션 未完了/完了トランザクション loser/winner transaction
실행 취소/재실행 UNDO/REDO undo/redo

2. ACIDとトランザクション境界

  • Atomicity(原子性):一つのトランザクションの変更は全部反映されるか,全部取り消される。
  • Consistency(一貫性):制約と不変条件を守り,有効な状態から有効な状態へ移る。誤った業務ロジックをDBMSが魔法のように直す意味ではなく,正しいアプリケーションロジックも必要である。
  • Isolation(独立性):並行処理が約束された分離レベルの可視性規則に従う。
  • Durability(耐久性):成功したCOMMITの結果は,設定が約束する障害モデルと耐久性条件の下で保持される。リモートバックアップの保証ではない。
BEGIN;
-- 一つの作業単位の変更
COMMIT;   -- 成功して確定

BEGIN;
-- エラー又は取消し判断
ROLLBACK; -- 明示的に取消し

成功COMMIT,明示的ROLLBACK,クラッシュは別の事象である。クラッシュ後,DBMSはログと格納状態を調べ,winnerをREDO,loserをUNDOできる。

3. S/Xロックとデッドロック

ロック型エンジンは読取りにS,変更にXをよく用いる。

保有 \ 要求 S X
S 互換 非互換
X 非互換 非互換

S/Sだけが互換である。ただしMVCCの通常読取りは同じブロッキングSロックを取らない場合があり,全読取り実装へ機械的に当てはめてはならない。

順序 T1 T2
1 X(A)を取得 —
2 — X(B)を取得
3 X(B)を要求→待機 X(B)を保有
4 X(A)を保有 X(A)を要求→待機
5 T1→T2→T1の待ち循環 デッドロック

DBMSは通常,循環を検出してvictimを選び,ロールバックする。アプリケーションは再試行できる。デッドロックは循環待ちである。長い待機には循環がないこともあり,starvationは一つの処理が機会を継続的に得られない現象である。

4. 三つの異常と分離レベル

ダーティリード

順序 状態/T1 T2の観測
0 初期X=100 —
1 X=70へ変更,未COMMIT —
2 — X=70を読む
3 ROLLBACKでX=100 消える値を既に読んだ

反復不能読取り

順序 T1の観測 T2
0 初期X=100 —
1 X=100を読む —
2 — X=120へ変更しCOMMIT
3 再読取りでX=120 —

ファントムリード

順序 T1の観測 T2
0 条件一致IDの初期値{1,2} —
1 検索結果{1,2} —
2 — 条件一致ID 3を挿入しCOMMIT
3 同じ検索の結果{1,2,3} —

次は SQL標準の現象表・最小保証モデルであり,全製品の実行を一律に予測する表ではない。

分離レベル ダーティ 反復不能 ファントム
READ UNCOMMITTED 許容 許容 許容
READ COMMITTED 防止 許容 許容
REPEATABLE READ 防止 防止 許容
SERIALIZABLE 防止 防止 防止

5. DBMSごとの実装差

以下は2026-10-21確認の一次資料による要約であり,全バージョン・設定を網羅せず,将来も不変とは限らない。運用版の文書を確認する。

  • PostgreSQL current:READ UNCOMMITTEDはREAD COMMITTED同様に動く。REPEATABLE READはトランザクションスナップショットにより最小保証より強く,ファントムも防ぐ。SerializableはSSIを使い,直列化失敗時に再試行が必要な場合がある。
  • MySQL InnoDB 8.4:既定はREPEATABLE READで,consistent readはトランザクションスナップショットを使う。locking read/文とnext-key・gap lockが,文・設定に応じてファントムと動作へ影響する。公式URLが自動クライアントへ403を返しても引用元はこの一次マニュアルである。
  • SQL Server:READ COMMITTEDはREAD_COMMITTED_SNAPSHOTに依存する。SNAPSHOTは別レベルで,ロック/版管理設定がブロックと可視性を変える。
  • Oracle Database:READ COMMITTEDとSERIALIZABLEのトランザクション分離(及びread-only)を支援する。読取りは文/トランザクション一貫性を使い,標準の四名称全てを公開する形ではない。
  • SQLite:書込みを直列化する。rollback journalとWALモードは異なり,WALの読取りはsnapshot isolationを見る。read_uncommittedは例外でshared-cache条件でのみ関係する。

6. WAL,チェックポイント,UNDO/REDO

write-ahead規則では,対応するdirty data pageより先にログレコードが安定記憶へ到達する。成功COMMITには設定された耐久性約束の下でdurable commit recordが必要である。チェックポイントはバックアップではなく,fuzzy checkpointは全ページを直ちにflushする必要がない。

WAL,STEAL(未COMMITページがディスクへ出られる),NO-FORCE(COMMIT時に全データページを強制書込みしない)を仮定する。

LSN ログ/事象 格納状態
— 初期 A=100, B=200, C=300
10 T0: C 300→330 —
20 T0 COMMIT —
30 CHECKPOINT active={} メタデータがT0以前を安全に処理し,C=330は必要に応じ生存/再実行すると仮定
40 T1 BEGIN —
50 T1: A 100→80,未COMMIT STEALでAページが早期にディスクへ
60 T2 BEGIN —
70 T2: B 200→260 NO-FORCEでBページは未書込み
80 T2 COMMIT,その後クラッシュ 直前ディスクA=80, B=200, C=330

T1はloserなので UNDO: A 80→100。T2はwinnerなので REDO: B 200→260。T0はチェックポイント仮定で安全に処理されC=330。最終値は A=100, B=260, C=330。これは指定した仮定での試験レベルのwinner/loser規則である。実際のARIESのpageLSN,補償ログ,チェックポイント方式は実装で異なり,全格納設計が全クラッシュで両操作を必要とするわけではない。

7. オリジナル問題5問

Q1

ACIDと境界について正しいものはどれか。

  • ア. 一貫性とはDBMSが誤った業務ロジックも自動修正することである。
  • イ. 耐久性とはCOMMITのたびリモートバックアップが必ず即時生成されることである。
  • ウ. 原子性とは変更の全部を反映又は全部を取消すことで,ROLLBACKは明示的取消しである。
  • エ. 成功COMMITとクラッシュ回復は同じ事象である。

正解:ウ (3)。 アは正しいロジックも必要なので誤り。イは耐久性約束とバックアップを混同。ウが正確。エは異なる境界を混同する。

Q2

T1がX(A),T2がX(B)を保有後,T1がX(B),T2がX(A)を要求した。最も正しいものはどれか。

  • ア. S/S競合によるダーティリードである。
  • イ. Xロックの循環待ちで,DBMSがvictimをロールバックしアプリが再試行できる。
  • ウ. 競合せず両方直ちに進む。
  • エ. 長時間待機は常にデッドロックで循環確認は不要である。

正解:イ (2)。 アはロックと現象が違う。イが正しい。ウはX/X非互換を無視。エは単なる待機と循環を混同する。

Q3

SQL標準現象表と製品実装の関係で正しいものはどれか。

  • ア. READ COMMITTEDは三現象を全て防ぐ。
  • イ. 全DBMSのREPEATABLE READは必ずファントムを許す。
  • ウ. SQL ServerのREAD COMMITTEDは設定に関係なく常に同じロック動作である。
  • エ. 表は最小保証で,PostgreSQL等はより強い場合があるため版・設定文書を確認する。

正解:エ (4)。 アは反復不能とファントムを許容。イは強い実装を無視。ウはREAD_COMMITTED_SNAPSHOTを無視。エが正しく区別する。

Q4

初期X=100。T1が未COMMITで70へ変更しT2が70を読んだ後,T1がROLLBACKして100へ戻った。T2の現象はどれか。

  • ア. ダーティリード
  • イ. 反復不能読取り
  • ウ. ファントムリード
  • エ. デッドロック

正解:ア (1)。 アは未確定値の読取り。イは確定変更を挟む同一項目の二回読取り。ウは条件一致行集合の変化。エは循環待ちで本手順にはない。

Q5

上の回復例でクラッシュ直前ディスクがA=80, B=200, C=330のとき,回復後はどれか。

  • ア. A=80, B=200, C=330
  • イ. A=80, B=260, C=300
  • ウ. A=100, B=260, C=330
  • エ. A=100, B=200, C=300

正解:ウ (3)。 アはUNDO/REDOなし。イはT1を残しT0を失う。ウはT1をUNDO,T2をREDO,T0を保持。エはT2とT0を失う。

8. クイックシート・罠・復習

クイックシート: ACIDは全部かゼロ,有効状態,約束した可視性,約束した耐久性。S/Sだけ互換。デッドロックは待ち循環。標準基準はRU=全許容,RC=dirty防止,RR=さらにnon-repeatable防止,SERIALIZABLE=全防止。STEALはUNDO,NO-FORCEはREDOの可能性を作る。

罠: consistencyを「常に正しいデータ」,durabilityをバックアップとしない。MVCC読取りへロック表を機械適用しない。長い待機とデッドロック,チェックポイントとバックアップ,最小保証と製品動作を混同しない。

自己点検: S/X表を再現できるか。三手順を値/集合で区別できるか。winner/loserとディスク状態からUNDO/REDOを説明できるか。

1/3/7日復習: 1日目はACIDと表を記憶から書く。3日目は三手順とクラッシュ例を数値まで再計算。7日目は全問の全選択肢を説明し,製品差を公式文書で再確認する。

公式出典

全て2026-10-21確認。製品動作は一次資料のみで,第三者解説は使用していない。

本資料は独自作成で,IPA又は各DBMSベンダーとの提携はない。合格及び特定製品の動作を保証しない。

ブログへ