【DBスペシャリスト試験対策 Day3】トランザクション制御・ロック実装・整合性制御まとめ
✅ 本記事の目的
DBスペシャリスト試験に向けて、トランザクション管理の中でも**「ロック制御と整合性」**に関する要点を、InnoDBとPostgreSQLの実装比較も含めて整理します。
📌 1. ロックの基本:共有ロックと排他ロック
ロック種別 | 読み取り | 書き込み | 他Txと共存 |
---|---|---|---|
共有ロック(S) | ✅ | ❌ | 他のSロックと共存可 |
排他ロック(X) | ✅ | ✅ | 単独でしか取得不可 |
-- 共有ロック
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
-- 排他ロック
SELECT * FROM users WHERE id = 1 FOR UPDATE;
🔄 2. Two Phase Locking(2PL:2相ロック方式)
◼ 構成
- 拡張フェーズ:ロックを取得できるが、解放できない
- 縮小フェーズ:ロックの取得は禁止、解放のみ可能
→ 一度ロックを解放したら、新しいロックは取れない
◼ 派生型
種類 | 特徴 |
---|---|
Strict 2PL | コミットまでロック保持(InnoDBの基本) |
Rigorous 2PL | S/Xロック両方をコミットまで保持 |
⚠️ 3. デッドロックの4条件と回避戦略
条件名 | 内容 |
---|---|
相互排他 | リソースを同時に1Txが専有 |
保持と待機 | ロック保持中に別のロックを待つ |
非奪取 | ロックを他Txが奪えない |
循環待機 | Tx同士が互いにロックを待つループ状態 |
⚔️ 4. 衝突制御戦略:Wait-Die vs Wound-Wait
条件 | Wait-Die | Wound-Wait |
---|---|---|
年上Tx → 年下Tx | 待機OK | 強制Abort(Wound) |
年下Tx → 年上Tx | 即Abort(Die) | 待機 |
→ いずれも2PLをベースにしたデッドロック予防方式
🧱 5. InnoDBのロック実装:Gap LockとNext-Key Lock
ロック | 対象 | ファントム対策 | INSERT防止 |
---|---|---|---|
Record Lock | 特定の行 | ❌ | ❌ |
Gap Lock | 行の間の隙間 | ✅ | ✅ |
Next-Key Lock | 行+隙間 | ✅(標準) | ✅ |
→ SELECT ... FOR UPDATE
で Next-Key Lock が自動適用される
🐘 6. PostgreSQLの実装:SSI方式(Serializable Snapshot Isolation)
- 読み取りは常にスナップショット参照(MVCC)
-
Serializable
はロック不要で直列化可能性を保証 - 実行後に矛盾を検出 → Abort処理で整合性担保
✅ 7. 分離レベルと整合性問題まとめ
分離レベル | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | ✅ | ✅ | ✅ |
Read Committed | ❌ | ✅ | ✅ |
Repeatable Read | ❌ | ❌ | ✅ |
Serializable | ❌ | ❌ | ❌ |
📘 午後Ⅱ風対策ポイント
- 整合性破壊の原因=排他制御ミス or 分離レベル設定ミス
- InnoDBかPostgreSQLかで実装アプローチが異なる
- SSI or Next-Key Lock でファントム対策を確実に押さえる
🧠 おまけ:覚えておきたい語呂&要点
- Wait-Die:「年下は死ぬ、年上は待つ」
- Wound-Wait:「年上は殺る、年下は待つ」
- Gap Lock:「空間ロックでINSERT防止」
- 2PL:「ロック取得→解放フェーズの2段階」
✍️ まとめ
本記事では、DBスペ試験において問われやすいトランザクション制御、ロック方式、整合性維持の要点を、MySQL(InnoDB)とPostgreSQLの実装比較を交えて整理しました。
次回は「トラブル分析型・午後Ⅱ演習問題」に取り組む予定です!