【データベース】読み書きをブロックしない!「多版同時実行制御(MVCC)」|情報処理問題1000本ノック
データベースのパフォーマンスを落とさずに、複数のユーザーが同時にデータを読み書きするための高度な制御技術「MVCC」の仕組みを攻略しましょう。
1. 問題:高効率な同時実行制御
【 問題 】 リレーショナルデータベースにおいて、データの更新時に元のデータを直接書き換えるのではなく、新しい「版(バージョン)」を作成することで、読み込み処理と書き込み処理が互いにブロック(排他)されないように制御する方式を何と呼ぶでしょうか?
ア、2相ロック方式 イ、多版同時実行制御(MVCC) ウ、楽観的並行性制御 エ、デッドロック検知
2. 正解:トランザクション制御に関する正解
正解: イ、多版同時実行制御(MVCC:Multi-Version Concurrency Control)
3. 解説:バージョン管理による「待機」の解消
MVCCは、データに時間的な広がり(複数のバージョン)を持たせることで、一貫性と並列性を両立させる技術です。
【図解:MVCCの動作メカニズム】
■ 新しい「版」の作成
・データを更新する際、古いデータはそのまま残し、新しい値を持つ「新しい版」を追加します。
■ トランザクションIDによる管理
・各版には、それを作成したトランザクションIDやタイムスタンプが付与されます。
■ 読み込みと書き込みの両立
・書き込み中(新しい版を作成中)であっても、他のユーザーは「自分の開始時点よりも前の古い版」を読むことができるため、読み書きの競合(ロック待ち)が発生しません。
■ 新しい「版」の作成
・データを更新する際、古いデータはそのまま残し、新しい値を持つ「新しい版」を追加します。
■ トランザクションIDによる管理
・各版には、それを作成したトランザクションIDやタイムスタンプが付与されます。
■ 読み込みと書き込みの両立
・書き込み中(新しい版を作成中)であっても、他のユーザーは「自分の開始時点よりも前の古い版」を読むことができるため、読み書きの競合(ロック待ち)が発生しません。
[ エンジニア視点の補足 ]
★ 不要な版の回収:古い版が溜まり続けるとディスクを圧迫するため、PostgreSQLの「VACUUM」のように、不要になった版を回収する仕組みが必要です。
★ 一貫性:各トランザクションは、実行開始時点の「スナップショット」を見ている状態になるため、データの整合性が保たれます。
★ 不要な版の回収:古い版が溜まり続けるとディスクを圧迫するため、PostgreSQLの「VACUUM」のように、不要になった版を回収する仕組みが必要です。
★ 一貫性:各トランザクションは、実行開始時点の「スナップショット」を見ている状態になるため、データの整合性が保たれます。
1. 理解のコツ: 「上書き保存」ではなく、常に「別名で保存」を繰り返しているイメージです。古いファイルが残っているので、誰かが編集中でも他の人は古いファイルを読み続けられる、というのがMVCCの強みです。
2. 試験対策の視点: 「新しい版を作成」「読み書きが衝突しない」「トランザクションIDで管理」といったキーワードが出たらMVCCを指します。伝統的な「ロック方式」との違いを意識して覚えましょう。
4. まとめ
「データの新しい版を作成し、排他を行わずに同時実行性を高める」。これが多版同時実行制御(MVCC)です。大規模なアクセスをさばく現代のデータベースエンジンにおいて、心臓部とも言える重要な技術であることを押さえておきましょう。
PR