データベース論(第
8
回):
トランザクションと障害時回復
北村泰彦
関西学院大学理工学部情報科学科
トランザクション
トランザクション
(transaction)
データベースに対する
応用プログラムレベルでの一つ
の
原子的作用
原子的
(at
omic)
それ以上分解できないこと
作用
(action)
データの
読み
(read)
,
書き
(write)
応用プログラム
レベル
論理的に意味のある操作レベル
SQL
レベルとは異なる
トランザクションの例
振替送金トランザクション
A
氏(依頼人)が
自
分の口座
から
C
円(金額)を
B
氏(
受取人)の口
座
に振
替送金す
る
.
もし
A
氏の
口座
残高が
C
円
未
満
なら
,
残
高不
足で
あるこ
と
を
A
氏
に
伝え
て終
了.
残
高が
C
円
以
上
で
あ
れば送金す
る
.
トランザクション内の二つのデ
ータ
ベース更新
A
氏の残
高から
C
円を引
き
,そ
れを
新たな残
高とす
る
.
B
氏の残高
に
C
円を
加え
,
そ
れ
を
新たな残
高とす
る
.
一貫性
(in
tegrit
y)
データベース
全
体
で
データの
整
合
性がとれ
て
い
る
こ
と
.
例:残額の総
和は
一定.
一貫性が
保証さ
れる
よう
に
,
ト
ラ
ン
ザクション
の原子
性を定
義
する
.
トランザクションの実行
トランザクション実行の三つのパターン
COMMIT
:完遂
ROLLBACK
:未遂
DBMS
による
ROLLBAC
K
:異常終了
トランザクションの状態遷移
ACID
特性
原子性
(Atomicity)
トランザクションは,それ
が
全
て行われ
る
か
,まった
く行
われ
ない
かのい
ずれ
か
で
ある
.
一貫性
(Consistency)
トランザクションは結果データベースの一
貫性を保
証
する.
隔離性
(Isolatio
n)
各々のトラ
ン
ザクションは他のトラン
ザクションの影響
を受け
な
い
.
耐久性
(Dur
ability)
コミットしたトランザクションが
行
ったデータ
ベ
ースの変化
は,その
後どのよう
な
障害が発
生し
ても失わ
れる
ことはない.
障害時回復
目的:データベースの
一貫性
を保つ.
分類
トランザクション障害
(transaction fai
lure)
:
論理の誤
り
による異常終了.ト
ラ
ンザクションの
アボート
.応用
プログラムの
強制終了
.
デッ
ドロック
による強制終了.
システム障害
(system failure)
:
DB
MS,OS
の障害
.
停
電
.ディスク
か
らデータを読み出すことはできる.シス
テムは再起動される.
メディア障害
(media failure)
:
二次記憶装置の障害
.
ディスクからデータの読み出しは不可能.
障害時回復
方法
トランザクション
UN
DO
:トラ
ン
ザクション障
害時,
異常終
了したト
ランザクション
を
UN
DO
する(データベースに対して行っ
た
すべて
の作用を
取
り
消す).
ROLLB
ACK
処理.
全局的
UN
DO
:シ
ステム
障
害時,
未完の
全てのトラン
ザクションを
UN
DO
する.
局所的
REDO
:システム障害時,
CO
MMI
T
していたが,
一時的
(二
次記憶に転送
されてい
ない)状態にあるトランザクション
は再起
動時に
RE
DO
する.
全局的
REDO
:メディア障害時,データベースの
保存
用ダ
ンプ
をも
とに,障害発
生まで
CO
MMI
T
された
全
てのトランザクシ
ョンを
REDO
する.
UNDO
および
REDO
はべき等である(何度繰り返しても同
じ結果になる).
障害時回復の分類
障害の例
振替送金トランザクション
begin
read(A
,x)
read(B
,y
)
x:=x
-C
if x < 0 then
rollback
y:=y+C
write(A,x)
write(B,y)
commit
ケース
1
:wr
ite(A,x)
の直
後にシステム障害が発生
A
の値のみ
が
変更され
て
い
るの
で,
再起
動のときに
begin
の状
態に戻
っ
て
い
る
必要がある
.
(U
NDO)
ケース
2
:co
mmit
の直後
にシステム障害が発生
再起動のと
き
,
A,
B
の値
が
ともに変更されていると
い
う
commit
の状
態を保証す
る必要がある
.
(R
ED
O)
階層型記憶アーキテクチャ
データベ
ー
スの更新は,更新した
いデータの入っているページを
主
記憶の一部であるデータベー
ス
バッファに呼び出し,更新し,二次
記憶に書き出す.主記憶は揮発
性,二次記憶は不揮発性である.
プログラムにお
け
る読み書き
(read/writ
e)
と,二次記憶上の読
み書き
(read-pa
ge/wr
ite-p
age)
と
は一致していない.
write
が実行さ
れてバッファ上では
書き込みが行われているものの,
まだその書き込みがディスクに
反
映されていないページのことを
ダーティページ
(dirty pa
ge)
という.
ダーティページ
を
ディスク上に
強制
的に書き込むことをフラッシュ
(flu
sh
)とい
う
.
ログ法
ログ
(log)
:トラン
ザクション実行の記録.
ジャーナ
ル
(journal)
と呼ぶこともある.
ログ法
(logging)
:ログを用いる障害回復の
方法.
ログは(ディスクの二重化などの)
安定記
憶
(stable storage)
に格納されることが望
ましい.
ロギング法
ログレコ
ード
トランザクション
T
の開始
(begi
n)
:[B:
T]
トランザクション
T
による書き込み
(write(A,x))
:
[W:T,A
,Ol
d,New]
ただし
Old
は更新前の値
(before image)
,
Ne
w
は更新
後の値
(after image)
トランザクション
T
による読み出し
(read(A,x))
:[R:T,
A]
トランザクション
T
のコミット
(commit)
:[C:T]
トランザクション
T
のアボート
(abort)
:[A:T]
各ログレコードには
LSN(Lo
g Sequence
Number)
と呼ばれる作成順の識別子が付けられ
るこ
とが多い.
WAL
プロトコル
ロギングの操作:
以下の同期をとる必要がある.
データベース
バッファを介するデータベース
更
新作業
ログバッファ
を介するログ更新作業
ログレコードなしにはディスク中の項目を元の値に戻
すことは不可能である
.
WAL
プロトコル
(Write Ahead Log proto
col)
データベースの更新はそれをまずログファイ
ル
に書き
出してから
行
う.
トランザクションを
COMMIT
する前に,全ての
データ
ベース更新
を
ログファイルに書き出す.
COMMIT
によるトランザクションの終了は,それがログ
ファイルに記録された時点である
.
No-undo/redo
方式
write
操作はログにのみ記録し,コミットするまで二次記
憶中のデータ更新は行わない.
before i
m
age
が二次記
憶に保持されているので,ログレコードに記録する必要
はない.
トランザクションの開始
:[B:
T]
を
ロ
グ用バッ
ファ
に書
き
込
む
.
トランザクションによる書き込み:
[W
:T,
A,Ne
w
]をログ用
バッファ
に書き込む.
トランザクションのコミット:
[C:
T]
を書
いた後,ログ用
バ
ッ
ファをフ
ラッシュする
.
さ
らにトランザクション中の
write
操作を二
次記憶に
反映させる
.
トランザクションのアボート:
[A:T]
をログ用バッファに書き込む.
リス
タート処理
(REDO)
:[C:
T]
のあるコミット済みトラン
ザクション
を検出する.
[W
:T
,A
,N
ew]
とし
て
記
録
さ
れてい
る
write
操作
を
データベースに反映させる
.
Undo/no-redo
方式
コミットするまでに
write
操作に関する二次記憶中のデー
タ更新を行う.
after image
が二次記憶に保持されている
ので,ログレコードに記録する必要はない.
トランザクションの開始
:[B:
T]
を
ロ
グ用バッ
ファ
に書
き
込
む
.
トランザクションによる書き込み:
[W
:T,
A,Old]
をログ用
バッファに
書き込
む
.
WA
L
プロトコルに従う限
り
,
writ
e
操作を
二次
記憶に反
映させ
て
もよい.
トランザクションのコミット:ト
ラ
ンザクション
中の
write
操作を二次
記憶に反映さ
せる.
[C:T]
を書
い
た
後,
ログ用
バ
ッ
ファ
をフラッ
シュ
する.
トランザクションのアボート:
[A:T]
をログ用バッファに書き込む.ト
ランザクション
中で
write
操作
に関して
be
for
e imag
e
に書き戻す.
リス
タート処理
(UNDO)
:[C:
T]
の
な
いアボート済みあるい
はア
ボート
す
べきトランザクション
を検出する.
[W
:T
,A
,Old]
とし
て
記
録
されている
write
操作に関し
て
be
fore image
に二
次記
憶を
書
き
戻
す
Undo/redo
方式
二次記憶
中の
データ更新とコミット処理を
独立させる
.フラッシングに
関する制約が
少なく,ディ
スクアクセスが
減少する.
トランザクションの開始:
[B:T
]をログ用バッファ
に書き込む.
トランザク
シ
ョンによる書き
込
み
:[W:T
,A
,Ol
d,N
ew]
をロ
グ用バ
ッ
ファに
書き込む.
WAL
プロトコルに従
う
限り,
write
操
作
を二次記憶に
反映させ
てもよい.
トランザクションのコミット:
[C:T]
を書いた後,ログ用バッファをフラッシュ
する.
トランザクションのアボート:
[A:T
]をログ用バッ
ファに書き込む.トランザ
クション
中で
wr
ite
操作に関して
UNDO
処理をする.
リスタート処理
(U
N
D
O
/R
ED
O
):
[C:T
]のあるコミット済みトランザクション
と,それがないアボート済みあ
るいはアボート
す
べきトランザクションを
検出する.
[W:T
,A,O
ld
,Ne
w
]と
し
て記録されている
write
操作
に関して前
者に関しては
RE
DO
処理,後者に対しては
UND
O
処理を行う.
例(
Undo/Redo
方式)
ログ
{[B:T
1
], [W:T
1
,A,a
1
,a
2
], [B:T
2
], [C:T
1
],
[B:T
3
],
[W:T
3
,B
,b
1
,b
2
], [W:T
2
,C,c
1
,c
2
],
[W:T
3
,D,d
1
,d
2
], [C
:T
2
]}
例
ログ
{[B:T
1
], [W:T
1
,A,a
1
,a
2
], [B:T
2
], [C:T
1
],
[B:T
3
],
[W:T
3
,B
,b
1
,b
2
], [W:T
2
,C,c
1
,c
2
],
[W:T
3
,D,d
1
,d
2
],
[C:
T
2
]
}
逆方向にスキャンする.
[C
:T
2
]により
ト
ランザ
クション
T
2
がコミ
ッ
ト済みであるこ
と
を認識する.
例
ログ
{[B:T
1
], [W:T
1
,A,a
1
,a
2
], [B:T
2
], [C:T
1
],
[B:T
3
],
[W:T
3
,B
,b
1
,b
2
], [W:T
2
,C,c
1
,c
2
],
[W:T
3
,D,d
1
,d
2
]
,
[C:
T
2
]
}
[W:T
3
,D,d
1
,d
2
]があるトランザクション
T
3
はコ
ミット済みで
ない
ので
この
write
操作の
UND
O
処理を行う.
例
ログ
{
[B:
T
1
], [W:T
1
,A,a
1
,a
2
]
, [B:T
2
], [C:T
1
],
[B:T
3
],
[W:T
3
,B
,b
1
,b
2
], [W:T
2
,C,c
1
,c
2
],
[W:T
3
,D,d
1
,d
2
], [C
:T
2
]
}
今度はログを先頭から順方向にスキャンする.
コミ
ット済みのトランザクション
T
1
による
[W:T
1
,A,a
1
,a
2
]に対
する
REDO
操作を行う.
例
ログ
{
[B:
T
1
], [W:T
1
,A,a
1
,a
2
]
, [B:T
2
], [C:T
1
],
[B:T
3
],
[W:T
3
,B
,b
1
,b
2
], [W:T
2
,C,c
1
,c
2
]
,
[W:T
3
,D,d
1
,d
2
], [C
:T
2
]
}
コミ
ット済みのトランザクション
T
2
による
[W:T
2
,C
,c
1
,c
2
]に対する
REDO
操作を行う.
チェックポイント法
チェッ
ク
ポイント法
(checkpoi
nti
ng)
:障害時回復を能率良
く行うための手法.一定の周期でバッファの内容をフラッ
シュする.
チェッ
ク
ポイントでの作業
実行中のト
ラ
ン
ザクションの
全
てを一時
停
止
(s
uspe
nd)
する.
データベースバッファの
内
容
をデータベースに書き出
す
.
チェックポイントレコード(実
行中トラン
ザクションリスト)を
ロ
グファ
イルに書き
出
す.
中断され
て
い
た
トランザクションを再開
(resume)
する.
チェッ
ク
ポイントを導入すると,チェックポイント以前に終
了している
ト
ランザクションはシステム再スタート時に回
復作業をする必要がないという利点がある.
チェックポイント法
チェ
ックポイン
ト
レコードから
UNDO
/
REDO
をするトランザク
ションを
見つけるアル
ゴリズム
1.UNDO
トランザク
シ
ョンのリスト
を
チ
ェ
ック
ポイント
時に
実行
中であ
っ
たトラン
ザク
ショ
ン
の
リ
ス
トとする
.
REDO
トラ
ンザ
ク
シ
ョンの
リ
ス
ト
を
NIL
とする
.
2.
ロ
グ
フ
ァ
イル
を
そ
のチェックポ
イ
ン
ト
レコー
ド
から
障害
発生時
まで順
に
検査する
.
2-1.
もし
BEGIN
TRA
N
SACTI
O
N
レ
コードを見つけれ
ば
,
そのトラン
ザクションを
UND
O
リストに
追加す
る.
2-2.
もし
CO
MMIT
レコ
ー
ド
を見つ
け
れ
ば,
そのトラン
ザ
クシ
ョンを
UND
O
リス
トから
RED
O
リストに移動する
.
2-3.
ログ
ファイ
ル
の
終わりにき
たら終
了する.
例
ログ
{[B:T
1
],
[W
:T
1
,A
,a
1
,a
2
],
[
B:
T
2
],
[
C:
T
1
],
[B:
T
3
],
[W
:T
3
,B,
b
1
,b
2
],
[CHECK
POINT,{
T
2
,T
3
}], [W:T
2
,C
,c
1
,c
2
], [
W
:T
3
,D,
d
1
,d
2
],
[C:T
2
]}
ログを逆方向にスキャンする.
[C:
T
2
]より
T
2
をコミット済
みトラン
ザクションに加える.
[W:
T
3
,D,
d
1
,d
2
]に対する
UN
DO
処理を行う
.
[W:
T
2
,C
,c
1
,c
2
]を読み飛
ばす.
[CHECK
POINT,{
T
2
,T
3
}]
に達しても
T
3
はア
ボート
す
べ
き
なので
さ
らにスキャンを続ける.
[W:
T
3
,B
,b
1
,b
2
]に対する
UN
DO
処理を行う
.
[B:T
3
]でスキ
ャ
ンを終了する.
[CHECK
POINT,{
T
2
,T
3
}]
か
ら
順方向にスキャンする.
コミット済み
T
2
による
[W
:T
2
,C,
c
1
,c
2
]に対する
REDO
処理を
行
い
終
了する.
シャドーページ法
デ
ィ
スク中の
ペー
ジをペー
ジテー
ブ
ルと
いう
アド
レス変換
テーブルを介して間
接
的
に
アク
セス
する
.
トランザクションの開始:カレントページテーブ
ルというトランザクション用のページテーブル
領域を確保する.元のページテーブルはシャ
ドーページ
テ
ーブルと呼ぶ.その位置を示す
ポイ
ンタ
を
シ
ャド
ーペ
ー
ジ
テ
ー
ブルポインタ
と
いう.カレントページテーブル読み書きの
た
め
のバッファをページテー
ブル用バッ
ファという.
トランザクションによる書
き込み:ページテー
ブル中の
i番目のページ
P(i)
の更新を行うとす
る.
それが
P(
i)に対する
最初の更新であれば,
ディスク中の空ページ
P'
を確保して
P(i)
の内
容をコピーし,カレ
ン
トページテーブル
i番目の
エ
ン
トリが指すページを
P'
に変更する.その後
,
データ用バッファ上の
P'
を更新する.
トランザクションのコミッ
ト:データ用バッファを
フラッシュし
た後
,ページテーブル用バッファ
を
フ
ラ
ッ
シ
ュ
する
.さ
らに
ディスク中のシ
ャド
ー
ペ
ー
ジ
テ
ーブルポインタ
を
カレント
ペ
ー
ジ
テ
ー
ブルを
指
すようにする.
トランザク
シ
ョンのアボート:カ
レ
ントページを
廃棄する.
シャドーページ法
問題点
更新を行う度にディスク中のデータを格納するページ
が変化する
た
め,ファイ
ル
を構成するページ相互の位
置関係がバラバラになる.データ読み出しがディスク
へのランダムアク
セ
スばかりになり,アクセス時間が
増加する.
シャドーページテーブ
ルポインタ
を
書き換える直前に
システム障害が生じたとする.その場合,カレントテー
ブルや更新後のデータを格納していたページ
がディス
ク中のゴミとなる.
ページ
ア
ク
セ
スの際にページ
テ
ーブルによるアドレス
変換のオーバヘッドがある.
メディア障害回復
トランザクション
障害やシステム障害に
比
べてメディア障害が発生する確率ははるか
に小さいが,その対処を
行わなかった場合
の損失は甚大である.
メディア障害に
対する基本的な対応はダン
プ
(dump)
処理の実行である.
ログは別々の装置に二重に書き込みを
行
う必要がある.