AP科目A 15:トランザクション,同時実行制御,障害回復
応用情報技術者試験の科目Aに必要なACIDとCOMMIT/ROLLBACK、S/Xロックとデッドロック、分離レベルと異常現象、WAL・チェックポイント・UNDO/REDOによる障害回復を、追跡例題とオリジナル演習問題5問で学びます。
AP科目A・第15回 · 2026年度・シラバスVer.7.2に基づく独立した学習資料です。IPAとの提携はなく、合格を保証しません。 シリーズ一覧を見る
学習インデックス
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 応用情報技術者試験(レベル3)シラバス Ver.7.2,PDF 44–45ページ(印刷フッター40–41ページ)
- PostgreSQL · MySQL 8.4 · SQL Server · Oracle Database 19c · SQLite
本資料は独自作成で,IPA又は各DBMSベンダーとの提携はない。合格及び特定製品の動作を保証しない。