基本情報処理技術者試験の勉強メモです.
自分が後から見返してわかればおkのスタンスで書いてますので悪しからず.
トランザクションとは
データベースに対するひとまとまりの処理.1つあるいは複数のSQL文から構成される.
SQLがすべて実行されてトランザクションが完了することをコミットという.
ACID特性
データベースには4つの特性があり、それぞれの頭文字をとってACID特性と呼ばれている。簡単にまとめたものが下表。
性質 | 内容 |
---|---|
原子性 (Atomicity) | トランザクションは分割不可 |
一貫性 (Consistency) | データベースのルールを守る |
独立性 (Isoration) | トランザクション同士が影響を与えない |
耐久性 (Durability) | トランザクションの結果は失われない |
以下、詳細に解説する。
Atomicity 原子性
1つのトランザクションはそれ以上細かく分割できない性質.複数のSQLで構成されていても,それらを分割して実行することはできない.
(例)
口座Aから口座Bに1万円送金する場合
1,Aからマイナス1万円する
2,Bにプラス1万円する
の二つの処理が必要.片方だけを実行しただけだとA,Bに整合性がとれない.
Consistency 一貫性
トランザクション開始~終了までで,整合性が取れることを保証する性質.データベースが定めたルール(非負制約など)一貫して守らなければいけないということ.
(例)
残高が1万円の口座から2万円引き出そうとすると残高が負になるため,一貫性が取れずトランザクションは中断される.
Isolation 独立性
それぞれの処理・トランザクションは独立していて他の処理に影響を及ぼさない性質.送金の例でいえば,Aからマイナスする処理とBにプラスする処理は互いに影響を及ぼさない独立した処理であることがわかる.
また,送金途中の結果は外部から読み込めない.(Bにプラスされる直前のAが減っただけの状態は外部から見れない.完了してから初めて見える.)
Durability 耐久性(永続性)
一度完了したトランザクションは,結果が永続的に保持される性質.
トランザクション処理が途中で中断された場合
バグやトラブルが発生した場合、トランザクションが中断されることがある。その際に、中断されたトランザクションを正常にコミットするための仕組みが存在する。
ロールバック
途中でトランザクションが中断されたときに,トランザクション開始前まで状態を戻すこと.
ロールフォワード
ロールバックされた処理を再実行する.ユーザからのこれといった操作は必要なく、DBMSが自動でやってくれるらしい。
ロールバック時(=トランザクション開始前)とロールフォワード完了時(=コミット完了時)の状態はログファイル(またはジャーナルファイル)に記録される.
排他制御
複数のトランザクションを同時に実行してしまうと不具合が起こる.これをロストアップデートという.
(例)
処理A:口座Xに1万円振り込む
処理B:口座Xに2万円振り込む
を同時に行うと...
1,Aが残高を照会(残高0円),Bも残高を照会(残高0円)
2,Aが1万円をプラスする(残高1万円)
3,Bは2万円をプラス(残高2万円)
4,Aが変更を更新(残高1万円)
5,Bが変更を更新(残高2万円)←これが最終の残高!
となり,本来3万円になるはずの残高が2万円になってしまう.
このロストアップデートを防ぐために排他制御を行う.具体的には,データにロックをかける.ロックには専有ロックと共有ロックがある。
専有ロック
他のトランザクションからの一切の操作を受け付けない。もうガチガチにロックする。
共有ロック
読み出し以外の操作を受け付けない.(登録・更新・削除は不可能)共有ロック中のデータベースに、別のトランザクションからの共有ロックは受け付けることができる。
デッドロック
二つ以上のトランザクションが互いにロックをかけてしまい,身動きが取れなくなる状態.
(例)
データa:Aさんの所有するデータ
データb:Bさんの所有するデータ
があるとする。
1:Aさんはデータaに専有ロックをかける
2:Bさんはデータbに専有ロックをかける
3:Aさんがデータbにアクセスしようとする → Bさんがロックしているため、アクセス不可
4:Bさんがデータaにアクセスしようとする → Aさんがロックしているため、アクセス不可
お互いにアクセス不可状態になってしまい、身動きが取れない!