直列化可能性とは
直列化可能性(シリアライザビリティ)とは、データベースにおいて複数の処理(トランザクション)が同時に(並行して)実行された結果が、それらを1つずつ順番に(直列に)実行した場合と同じ結果になることを保証する性質です。
データベースの処理速度を上げるために、システムは複数のユーザーからのリクエストを同時に並行処理します。しかし、同じデータに対して同時に書き込みや読み込みを行うと、データの辻褄が合わなくなる(不整合が起きる)リスクがあります。直列化可能性が保証されているということは、同時にたくさんの処理が混ざり合って動いていても、最終的には「誰も邪魔をせず順番に処理したのと同じ」正しいデータ状態に落ち着くことを意味し、データベースの信頼性を示す最も高い基準の1つです。
具体例
銀行の口座から2人が同時に1万円を引き出そうとする場面です。AさんのスマホとBさんのキャッシュカードで同時に残高1万円の口座にアクセスした際、並行処理がうまく制御されていないと、両方の処理が「残高あり」と判定してしまい、口座から2万円が引き出せてしまうバグが発生します。直列化可能性が保証されていれば、どちらか一方が先に処理され、もう一方は「残高不足」として正しく弾かれます。
もう少し詳しく
直列化可能性を達成するために、データベース管理システム(DBMS)は「排他制御(同時実行制御)」を行います。最も代表的なプロトコルが「2相ロック(2-Phase Locking:2PL)」です。これは、トランザクション中に必要なロックを獲得していく第1相(成長相)と、一度ロックを解放し始めたら二度と新たなロックを獲得しない第2相(縮退相)に処理を分けるルールです。2相ロックに従うことで、生成される実行スケジュールは必ず直列化可能になることが数学的に証明されています。また、トランザクションの独立性(アイソレーション)の度合いを示す「トランザクション隔離レベル」において、「SERIALIZABLE(直列化可能)」は最も厳しいレベルに位置付けられており、データの不整合(ダーティリード、ノンリピータブルリード、ファントムリード)をすべて完全に防ぎますが、並行処理の効率は最も低下します。
試験でのポイント
試験においては、直列化可能性(シリアライザビリティ)が、データベースの並行制御において目指すべき「正しいスケジュール」の基準であるという概念が問われます。また、これを実現する具体的な技術として「2相ロックプロトコル(2PL)」の定義や動作ルールがよく出題されます。注意点として、2相ロックを使用しても「デッドロック」が発生する可能性は排除できないため、デッドロックの防止や検出・解消メカニズムとセットで理解しておく必要があります。さらに、SQL規格で定義されている4つのトランザクション隔離レベル(SERIALIZABLE、REPEATABLE READ、READ COMMITTED、READ UNCOMMITTED)と、それぞれで発生し得る不整合の組み合わせについても表の穴埋め形式などで頻出します。
関連する用語
直列化可能性に関連する用語としては、同時実行制御の代表的手法である「2相ロック(2PL)」や、データの編集を制限する「排他制御(ロック)」があります。また、トランザクションの安全性を保証する「ACID特性」の中の「I(Isolation:独立性/隔離性)」、およびその品質基準である「トランザクション隔離レベル」、そしてロックの競合によって処理が停止する「デッドロック」も密接に関連しています。