【デスペ5問】直列化可能性と2相ロック(データベーススペシャリストAMII)
このNoteには、データベーススペシャリスト(デスペ)のAMIIの「直列化可能性」と「2相ロッキングプロトコル」についてまとめました。
どちらも出題は少ないのですが、実は関係があります。
直列化可能性を保証する手段が、2相ロックだからです。
例えば「デッドロックの対策」を2つ言えますか?
正解は、タイムアウトを設ける、ロックするデータの順番を全トランザクションで統一する、です。
直列化可能性と2相ロックも同じで関係があります。さらに隔離性水準(READ UNCOMMITTEDなど)や独立性阻害要因(ダーティリードなど)との関連も出てきます。
デスペのAMIIはざっくり5年分解けば、全パターンが把握できます。
私が合格した時の学習ノートを基に、ジャンル毎に問題をまとめました。
このNoteの解説は、私がIT専門学校での授業内容を基にしています。
それでは始めましょう!
直列化可能性(serializability)
例えば銀行口座には、たくさんの利用者が同時に操作するので、複数のトランザクションが同時に実行されます。
1つ1つのトランザクションを順番に実行していては、いつまで経っても処理が進まないので、同時に並列実行します。
とはいえ、通販企業の口座であれば、たくさんの利用者から入金があるでしょうし、たくさんの小売店への出金もあるでしょう。
あるトランザウションが変更途中のデータを、別のトランザクションがさらに変更するなどで、ツジツマが合わなくなってしまってはいけません。
そこで、並列実行するトランザクションは「直列化可能性」を保証する必要があります。
直列化可能性とは、複数のトランザクションを並列に同時実行した結果と、1つずつ順番に実行した結果が同じになること。トランザクション管理では、直列化可能性を保証するよう工夫します。
正答はウ。
ア:2相コミットとは、分散データベースシステムでのトランザクションの確定処理の手順です。主サイトが、全ての従サイトに「確定できますか?」と問い合わせ、できます返答があったら、「コミットしてください」と指示します。
イ:隔離性水準(ISOLATION LEVEL)とは、トランザクションの独立性の段階水準のことです。隔離性水準には4段階あり、独立性が低いとツジツマが合わないことが起こりやすいですが処理が速く、独立性が高いとツジツマは合いますが順番待ちが起こりやすいです。
ウ:正しい。
エ:直列実行の説明です。並列実行についての記述がありません。
正答はウ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。
イ:直列化可能とは、直列実行することではなく、並列実行の話です。
ウ:正しい。
エ:直列化可能とは、並列実行と直列実行の使い分けではありません。
2相ロック(2相ロッキングプロトコル)
2相ロックは以下の手順です。
処理を行う前にデータをロックして、処理を行い
処理が終わったらロックを解除(アンロック)する
一見「ロック→アンロックで普通じゃん」と思いますが、もう少し深いです。
データを読み込んだり書き込んだりする前にロックします。ロックしたデータについて、全ての処理が終わってからアンロックします。
処理途中のデータを他のトランザクションにロックされたり変更されたりすると、ツジツマが合わなくなりますからね。
また、1つのトランザクションでロックとアンロックは1回ずつ。つまり、データaをロック→処理→アンロックしたら、再度ロックすることはありません。
アンロックから2回目のロックの間に、他のトランザクションが変更したら、ツジツマが合わなくなるからです。
正答はエ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。2相コミットは、1つのトランザクション内でのロックの手順であり、他のトランザクションのロックとの兼ね合いには無関係です。
イ:コミット順は、トランザクションの内容やロック獲得状況が変わります。短くシンプルなトランザクションほど早く完了しそうなのは想像できますよね。
ウ:コミット(確定)処理をしてから、データをアンロックすべきです。アンロックしたら他のトランザクションがアクセスして変更するかもしれませんから。
エ:正しい。全て獲得して(必要な処理を完了したら)全て解除できます。
正答はエ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。2相コミットは、1つのトランザクション内でのロックの手順であり、他のトランザクションのロックとの兼ね合いには無関係です。
イ:アンロックは当該データへの処理が全て完了してからなので、再度ロックはしません。アンロックから再度ロックの間に、他のトランザクションによって変更されていたらツジツマが合わなくなるから。
ウ:共有ロックもできます。読み取りなら共有ロックで充分ですから。専有ロックだと無駄な順番待ちが発生してしまいます。勿論書き込みをするなら専有ロックで獲得すべきです。
エ:正しい。2相ロックによって、関係するデータには1つずつのトランザクションの処理がされるため、1つずつ直列実行された結果と同じになります。
2相ロックによる直列化可能スケジュール
最後に、2相ロッキングプロトコルに従った具体的なトランザクションを見てみましょう。
正答はエ。
ア:T1もT2もデータaを読み込む前にロックしておらず、読み込んだ後にロックしています。読み込み→ロックの間に、他のトランザクションに変更されるとツジツマが合わなくなります。
イ:T1もT2もデータaのアンロックの後に、データbのロックをしているので、「全てのロックを獲得した後に、アンロック」に反しています。
ウ:T1がデータaをアンロックした後に、データbをロックしているので、「全てのロックを獲得した後に、アンロック」に反しています。
エ:正しい、データaにアクセスする前にロックし、データbにアクセスする前にロックしています。アンロックは、aとbへの処理が全て終わった後にしています。
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ
この記事が参加している募集
学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ