11. ロジック例
SET @avail SELECT COUNT(*) FROM doctors WHERE state == “診察可能”;
IF @avail <= 1 BEGIN -- 医師が一人以下なら
RAISEERROR(“診察可能な医師が居なくなります”);
ELSE -- 医師が二人以上いるなら
UPDATE doctors SET state == “予約済み”
WHERE state ==“診察可能”AND name == “田中医者丸”;
COMMIT;
END
• 以下のロジックで良さそうに見える
– なお発表者はストアドプロシージャの文法に詳しくないので以下は
フィーリングでお読みください
21. 2 Phase Lock
• なんでこの方法ならSerializableになるのかは
Philip A. Bernstein, Vassos Hadzilacos, Nathan
Goodman (1987): Concurrency Control and
Recovery in Database Systems を参照
26. Dependency Serialization Graph
時間
B
A
医師何人?
医師何人?
2人居るで 2人居るで
じゃあ佐藤さんヨロ
じゃあ田中さんヨロ
ええで あかんで
コミット頼む
OK
• 「読んだものを書いた」「書いた物を読んだ」「書いた後に書
いた」のいずれかの順序関係がある場合に依存辺を追加し
ていく
A A B A B
Bが読んだ値にAが書き込むので
Anti-Dependency(問題ない)
A B
Aが読んだ値にBが書き込むので
Anti-Dependency→円環できた
27. Dependency Serialization Graph
• ついでにRead Only Anomalyも対処できる
時間
B
A
口座Aを確認
A A B A B
Bが読んだ値にAが書き込むので
Anti-Dependency(問題ない)
Aがコミットした値をCが
読むのでDependency
C
口座Bを確認
口座Aに20万預ける
口座Bから10万引き出す(A+Bが負になるので金利込の11万を減らす口座Aを確認
コミット
あかんで
A B
C
Cが読んだ値に
Bが書き込んだので
Anti-Dependency→円環できた
A B
C