pulpul 日本の試験

データベーススペシャリスト 概念書 · データベース

トランザクション処理

要点と定義

トランザクションは、データベースに対する一連の処理をひとまとまりとして扱う単位です。原子性は処理をすべて反映するか、すべて取り消す性質です。たとえば振替で引落しだけが反映されて終わらないようにします。一貫性は整合性を保つこと、独立性は同時実行による干渉を制御すること、永続性は確定結果を保持することです。

同時実行制御では、複数のトランザクションが同じデータを扱う際、ロックなどで整合性を保ちます。共有ロックと専有ロックが両立するかは、種類だけでなく対象範囲にもよります。過去の出題で扱った補足として、表全体への専有ロックは表内の行にも及び、行ロックと競合する場合があります。

2相ロッキングでは、ロックを取得する拡大相の後に、解除する縮小相へ移ります。解除を始めた後は新たなロックを取得できないため、必要なロックをそろえてから解除します。これは直列化可能性を支える順序制約であり、全処理を直列にする規則ではありません。デッドロックが起きる可能性もあります。

複数の処理が互いのロック解放を待ち、待ち状態が循環するとデッドロックになります。複数レコードを更新する処理でロック取得順を共通にすれば、順序の食い違いによる循環待ちを防ぎやすくなります。

MVCCはデータの複数の版を用いて、読取りと書込みの競合待ちを抑える方式です。書込み時に新しい版を作ると、読取り側が別の版を参照できる場合があります。過去の出題で扱った補足として、MVCCでも明示的なロックや更新ロックが使われ、デッドロックが起きることがあります。

障害回復では、ログの更新前情報を未完了処理の取消しに、更新後情報を確定済み更新の再適用に使います。チェックポイントは回復時に確認するログの範囲を絞る目印です。過去の出題で扱った補足として、媒体障害以外のシステム障害では、チェックポイント以前にコミット済みの処理は通常回復作業が不要とされます。

適用条件と例

隔離性水準は、同時実行時の読取りの変化をどこまで防ぐかを定めます。ダーティリードは未コミットの変更を読むこと、非反復読取りは同じ行を読み直した際に値が変わることです。過去の出題で扱った補足として、READ COMMITTEDはダーティリードを防ぎますが、別トランザクションのコミット済み更新が間に入れば非反復読取りは起こり得ます。REPEATABLE READは同じ行の再読時の値の変化を防ぎます。実際の細かな挙動はSQL方言やDBMSの実装・設定にも左右されます。

たとえば在庫を読む処理と更新する処理が並行する場合、未コミット値を読んでよいか、同じ行の再読で値が変わってよいかを要件から決めます。MVCCは読取り待ちを減らす場合がありますが、書込み同士の競合やロック待ちまでなくすとは限りません。

この節の続き

ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。

アプリでこの節を読む