![見出し画像](https://assets.st-note.com/production/uploads/images/144269154/rectangle_large_type_2_d6b7de3d1254ffd171b13160c109167f.png?width=1200)
【デスペ5問】直列化可能性と2相ロック(データベーススペシャリストAMII)
このNoteには、データベーススペシャリスト(デスペ)のAMIIの「直列化可能性」と「2相ロッキングプロトコル」についてまとめました。
どちらも出題は少ないのですが、実は関係があります。
直列化可能性を保証する手段が、2相ロックだからです。
データベースのAMIIは正直簡単ですが、用語(知識)で終わらさず、何のための技術(手段)まで学習すると、PMI/PMIIのネタになります。
例えば「デッドロックの対策」を2つ言えますか?
正解は、タイムアウトを設ける、ロックするデータの順番を全トランザクションで統一する、です。
直列化可能性と2相ロックも同じで関係があります。さらに隔離性水準(READ UNCOMMITTEDなど)や独立性阻害要因(ダーティリードなど)との関連も出てきます。
AMIIは通過して当然。それだけでなく、知識と知識を紐づけて、PMI/PMIIの筆記問題への武器にするまで昇華させたいです。
デスペのAMIIはざっくり5年分解けば、全パターンが把握できます。
私が合格した時の学習ノートを基に、ジャンル毎に問題をまとめました。
![](https://assets.st-note.com/img/1718540571664-Vgmw7HLHH1.png?width=1200)
![](https://assets.st-note.com/img/1718540571722-8iNPhDcKok.png?width=1200)
このNoteの解説は、私がIT専門学校での授業内容を基にしています。
それでは始めましょう!
直列化可能性(serializability)
直列化可能性とは、複数のトランザクションを並列に同時実行した結果と、1つずつ順番に実行した結果が同じになることです。
例えば銀行口座には、たくさんの利用者が同時に操作するので、複数のトランザクションが同時に実行されます。
1つ1つのトランザクションを順番に実行していては、いつまで経っても処理が進まないので、同時に並列実行します。
とはいえ、通販企業の口座であれば、たくさんの利用者から入金があるでしょうし、たくさんの小売店への出金もあるでしょう。
あるトランザウションが変更途中のデータを、別のトランザクションがさらに変更するなどで、ツジツマが合わなくなってしまってはいけません。
そこで、並列実行するトランザクションは「直列化可能性」を保証する必要があります。
直列化可能性とは、複数のトランザクションを並列に同時実行した結果と、1つずつ順番に実行した結果が同じになること。トランザクション管理では、直列化可能性を保証するよう工夫します。
トランザクションの直列化可能性(serializability)が保証されるのはどれか。
ア:2相コミットができ、複数のトランザクションを同時実行できる
イ:隔離性水準が低く、トランザクション同士の干渉が起こる
ウ:複数のトランザクションが同時実行された結果と、順番に逐次実行された結果が同じになる
エ:複数のトランザクションが、1つずつ順番に実行される
平成30年午前2問11より改変
令和02年午前2問11より改変
正答はウ。
ア:2相コミットとは、分散データベースシステムでのトランザクションの確定処理の手順です。主サイトが、全ての従サイトに「確定できますか?」と問い合わせ、できます返答があったら、「コミットしてください」と指示します。
イ:隔離性水準(ISOLATION LEVEL)とは、トランザクションの独立性の段階水準のことです。隔離性水準には4段階あり、独立性が低いとツジツマが合わないことが起こりやすいですが処理が速く、独立性が高いとツジツマは合いますが順番待ちが起こりやすいです。
ウ:正しい。
エ:直列実行の説明です。並列実行についての記述がありません。
トランザクションの直列化可能スケジュールの記述はどれか。
ア:デッドロックの発生を抑えるために、できるだけトランザクションを直列に実行する
イ:処理時間が最短になるように、トランザクションの前後関係を考慮して直列に実行する
ウ:トランザクションを順番に実行した場合と同じ結果になるように、並列実行する
エ:読み取りのみのトランザクションは並行実行し、更新するトランザクションは直列実行する
正答はウ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。
イ:直列化可能とは、直列実行することではなく、並列実行の話です。
ウ:正しい。
エ:直列化可能とは、並列実行と直列実行の使い分けではありません。
2相ロック(2相ロッキングプロトコル)
直列化可能性(serializability)を保証する手順が、「2相ロック(2相ロッキングプロトコル)」です。
2相ロックは以下の手順です。
処理を行う前にデータをロックして、処理を行い
処理が終わったらロックを解除(アンロック)する
一見「ロック→アンロックで普通じゃん」と思いますが、もう少し深いです。
データを読み込んだり書き込んだりする前にロックします。ロックしたデータについて、全ての処理が終わってからアンロックします。
処理途中のデータを他のトランザクションにロックされたり変更されたりすると、ツジツマが合わなくなりますからね。
また、1つのトランザクションでロックとアンロックは1回ずつ。つまり、データaをロック→処理→アンロックしたら、再度ロックすることはありません。
アンロックから2回目のロックの間に、他のトランザクションが変更したら、ツジツマが合わなくなるからです。
2相ロック方式によるトランザクションの同時実行制御について正しい記述はどれか。
ア:全てのトランザクションが直列制御され、デッドロックは発生しない
イ:トランザクションのコミット順序は、トランザクションの開始時刻順になる
ウ:トランザクションは、自分が獲得したロックを全て解除した後にだけ、コミットを実行できる
エ:トランザクションは、必要なロックを全て獲得できた後にだけ、ロック解除命令を実行できる
令和03年午前2問13より改変
令和05年午前2問12より改変
正答はエ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。2相コミットは、1つのトランザクション内でのロックの手順であり、他のトランザクションのロックとの兼ね合いには無関係です。
イ:コミット順は、トランザクションの内容やロック獲得状況が変わります。短くシンプルなトランザクションほど早く完了しそうなのは想像できますよね。
ウ:コミット(確定)処理をしてから、データをアンロックすべきです。アンロックしたら他のトランザクションがアクセスして変更するかもしれませんから。
エ:正しい。全て獲得して(必要な処理を完了したら)全て解除できます。
2相ロック方式によるトランザクション処理について正しい記述はどれか。
ア:デッドロックは発生しない
イ:同一トランザクション内なら、アンロック後にロックできる
ウ:トランザクションは専有ロックだけができる
エ:トランザクションの競合直列可能性が保証される
正答はエ。
ア:デッドロックの対策では、一定時間待つとタイムアウトさせたり、ロックするデータの順番を全トランザクションで統一させたりなどが典型です。2相コミットは、1つのトランザクション内でのロックの手順であり、他のトランザクションのロックとの兼ね合いには無関係です。
イ:アンロックは当該データへの処理が全て完了してからなので、再度ロックはしません。アンロックから再度ロックの間に、他のトランザクションによって変更されていたらツジツマが合わなくなるから。
ウ:共有ロックもできます。読み取りなら共有ロックで充分ですから。専有ロックだと無駄な順番待ちが発生してしまいます。勿論書き込みをするなら専有ロックで獲得すべきです。
エ:正しい。2相ロックによって、関係するデータには1つずつのトランザクションの処理がされるため、1つずつ直列実行された結果と同じになります。
2相ロックによる直列化可能スケジュール
最後に、2相ロッキングプロトコルに従った具体的なトランザクションを見てみましょう。
トランザクションT1とT2が、データaとbにアクセスする。直列化可能性を保証できるトランザクションスケジュールはどれか。
![](https://assets.st-note.com/img/1718528285378-cuLgH0F5O6.png)
正答はエ。
結論。なるべく最初に必要な全データをロックして、トランザクションの最後にまとめてアンロックしているものを選びましょう。
ア:T1もT2もデータaを読み込む前にロックしておらず、読み込んだ後にロックしています。読み込み→ロックの間に、他のトランザクションに変更されるとツジツマが合わなくなります。
イ:T1もT2もデータaのアンロックの後に、データbのロックをしているので、「全てのロックを獲得した後に、アンロック」に反しています。
ウ:T1がデータaをアンロックした後に、データbをロックしているので、「全てのロックを獲得した後に、アンロック」に反しています。
エ:正しい、データaにアクセスする前にロックし、データbにアクセスする前にロックしています。アンロックは、aとbへの処理が全て終わった後にしています。
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ
いいなと思ったら応援しよう!
![せんない](https://d2l930y2yx77uc.cloudfront.net/assets/default/default_profile_5-043439195e40e86fd7641a3a1daf982637d77ec6f14b67d3fc98ab92374404ac.png?width=600&crop=1:1,smart)