トランザクション処理
要点と定義
トランザクションは、データベースに対する一連の処理を一つの単位として扱うものです。ACID特性の原子性は、処理全体が成功するか、失敗時には処理前の状態へ戻るかのどちらかを保証します。送金で引落し後の入金に失敗したら、引落しも取り消す例が当てはまります。これは、整合性制約を保つ一貫性、確定した更新を障害後も保つ耐久性、並行処理の影響を分離する独立性とは異なります。原子性が問われる問題では、この「全体を実行するか全体を取り消すか」という性質が正答判断に必要です。
同時実行制御(排他制御)は、複数のトランザクションが同じデータを同時に更新して不整合を生じさせないための仕組みです。ロック方式では、共有ロックは読み取りに使われ、共有ロック同士は両立できる場合があります。専有ロックは更新に使われ、同じデータへの他のロック要求を待たせます。ロック粒度は、表や行など、ロックをかける対象の大きさです。表単位と行単位では競合の起こりやすさと管理するロック数が変わるため、この違いが正答判断の要点になります。
2相ロッキングでは、ロックを取得する段階の後に解放する段階へ移ります。解放を始めた後に新しいロックを取得しないことで、並行処理の整合性を保ちやすくします。ただし、2相ロッキングだけでデッドロックを防げるわけではありません。デッドロックは、複数の処理が互いに相手の保持するロックを待つ循環待ちです。処理順序の問題では、要求されるロックの種類と各処理が保持しているロックを追い、待ちが一周するかが判断材料になります。
トランザクションの状態遷移では、アボート処理の完了後はアボート済、コミット処理の完了後はコミット済になります。また、コミット処理中に障害などが起き、アボート処理中へ移ることがあります。アボート処理中からコミット処理中へ戻ることはありません。状態の問題では、処理の終点が確定か取り消しかを見極めることが正答判断に必要です。
障害回復では、バックアップはデータベースを復元するための複製、ログファイル(ジャーナルファイル)は更新をたどるための記録です。チェックポイントは、障害後に回復処理を進める際の基準となる情報です。ログは更新の経過を記録しており、単なるデータベース複製とは役割が異なります。この役割の区別が、更新記録を担うファイルを問う問題の判断に必要です。
バックアップを復元した後、取得時点以降の更新をログから順に反映して新しい状態へ進める回復方法がロールフォワードです。これに対し、ロールバックは処理を取り消して以前の状態へ戻す方法です。例えば、月曜のバックアップを戻してから火曜の更新記録を適用すれば、バックアップ以後の状態へ進められます。ログが不足または破損していれば、その記録にない更新を再現できないことがあります。復旧の向きとログの役割が、回復方法を問う問題の正答判断に必要です。
適用条件と例
表内の異なる行を二つの処理が更新する場合、表単位ロックでは、一方が表をロックしている間に他方も待たされやすくなります。行単位ロックなら、異なる行への更新を並行して進めやすくなります。一方、十行を別々にロックするなら、表単位の一つのロックより多くのロックを管理することになります。行単位は競合を減らしやすい反面、ロック管理に必要なメモリが増えやすい、という両面で比較します。実際の動作は処理内容にもよりますが、粒度が細かいほど管理対象が増えるという基本関係は、ロック粒度の比較に使えます。
この節の続き
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む