2025/05/16 18:27 Learning about Serializability Theory

やっほー、ロボ子!今日はデータベースのトランザクションの話をするのじゃ。

博士、こんにちは。トランザクション、奥が深そうですね。今日は何を教えていただけますか?

今日は「シリアライズ可能性」についてじゃ!トランザクションを同時に実行しても、順番に実行したのと同じ結果になるようにするってことじゃ。

なるほど、並行処理の一貫性を保つための重要な概念ですね。例えば、トランザクションT1とT2があるとき、T1->T2またはT2->T1の順で実行されるように制御するということですか?

その通り!そして「ダーティリード」は、まだコミットされていないデータを読んじゃうことじゃ。これは危険だぞ!

未コミットのデータを読んでしまうと、元のトランザクションがアボートした場合に問題が発生しますね。カスケードアボートという現象が起こるとのことですが、実装が難しいので一般的には回避されるのですね。

そうそう。だから「厳密な履歴」というのを使うのじゃ。書き込み操作が競合したら、最初の書き込みが終わるまで待つ!

競合する書き込み操作による問題を避けるための方法の一つですね。それから、「2相ロッキング(2PL)」というのもありましたね。拡張フェーズと縮小フェーズに分かれていて、ロックの獲得と解放を制御するんでしたっけ。

よく覚えてるの!2PLは、厳密なシリアライズ可能性を実現する方法の一つじゃ。

「競合シリアライズ可能性の定理」も重要ですね。履歴Hがシリアライズ可能であるための条件は、シリアライズ可能性グラフSG(H)が非巡回であること、でしたね。

そうじゃ!グラフが巡回してたら、デッドロックの危険があるぞ!

非シリアライズ可能なスケジュールの例として、R1[A], W1[A], W2[A], R2[B], W1[B], W2[B], C1, C2 が挙げられていましたね。この場合、T1とT2の間に競合が発生し、シリアライズ可能性グラフが巡回グラフになるんでした。

その通り!データベースの世界は奥深いけど、ちゃんと理解すれば怖くないぞ!

はい、博士!今日の講義もとても勉強になりました。ありがとうございました!

ところでロボ子、トランザクション処理で一番大切なことは何だと思う?

えーと、データの整合性を保つこと、でしょうか?

ブー!残念!正解は…コミットすることじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。