排他制御(DB)の解説(基本情報技術者シラバス用語)

目次

排他制御(DB)とは

排他制御とは、データベースにおいて複数のユーザーが同時に同じデータを書き換えようとしたときに、データの矛盾や破壊を防ぐための仕組みです。もし同時に複数の書き込みが行われると、後から書き込まれたデータで上書きされ、先に書き込んだ内容が消えてしまう「更新消失」などの問題が発生します。これを防ぎ、データの整合性を担保するために、ある処理がデータを編集している間は、他の処理がそのデータを変更できないように「ロック(鍵)」をかけます。

ロックには、データを読み込むことはできるが変更はさせない「共有ロック」と、読み込みも変更も制限する「占有ロック」があります。これらを適切に使い分けることで、データの正しさを保ちながら、多くのユーザーが効率よくデータベースを利用できるようになります。

具体例

例えば、残り1席の飛行機の座席予約システムを考えてみましょう。AさんとBさんが同時にこの座席の購入ボタンを押しました。

  • 排他制御がない場合:二人の購入処理が同時に進み、両方に「予約完了」が表示されてしまいます。しかし実際には座席は1つしかないため、ダブルブッキングというデータの矛盾が起こります。
  • 排他制御がある場合:Aさんの処理が始まった瞬間にその座席データに「占有ロック」がかかります。Bさんの処理はロックが解除されるまで待たされるか、エラーとなって購入できず、データの矛盾が防げます。

もう少し詳しく

排他制御は、データベースにおけるトランザクションの独立性(Isolation:アイソレーション)を保証するために不可欠な技術です。トランザクションとは、一連の処理を一つのまとまりとして扱う単位のことであり、データベースの信頼性を支えるACID特性の重要な一要素です。排他制御の実装方法には、大きく分けて「悲観的排他制御(悲観的ロック)」と「楽観的排他制御(楽観的ロック)」の2種類が存在します。

悲観的排他制御は、データ更新の衝突が頻繁に起こることを想定し、データを取得する段階で事前にロックをかける手法です。他のトランザクションによる更新を確実に防ぐことができますが、待機時間が増え、システム全体のパフォーマンスが低下する可能性があります。一方、楽観的排他制御は、データの衝突がめったに起こらないと想定し、データを読み込む時点ではロックをかけず、更新を実行する直前に他者によってデータが変更されていないかを確認する手法です。データ内に「バージョン番号」や「最終更新日時」を保持し、読み込み時と更新時で値が変化していないかを判定します。もし他者に変更されていた場合はエラーとし、処理をロールバック(取り消し)します。この手法はロックの保有期間が短いため、パフォーマンス向上に寄与します。

また、排他制御で頻繁に生じる問題として「デッドロック」があります。これは、2つ以上のトランザクションが互いに相手が保持しているロックの解除を待ち合ってしまい、処理が永久に停止してしまう現象です。デッドロックを防ぐためには、データへのアクセス順序ルールをシステム全体で統一する、あるいはロックの待ち時間にタイムアウト(時間切れ)を設定して強制的に処理を終了させるなどの設計上の工夫が必要です。

試験でのポイント

IT試験(ITパスポートや基本情報技術者試験)では、共有ロックと占有ロックの動作の違いと、それらの組み合わせの可否が非常によく問われます。共有ロック同士は同じデータに対して同時にかけることができますが、占有ロックはすでに他の共有ロックや占有ロックがかかっているデータに対してかけることはできません。このルールを表(マトリクス)形式で読み解く問題が定番です。

また、デッドロックの発生条件と、その対策方法についてもよく出題されます。特に「アクセスするテーブルの順序を全てのトランザクションで統一することによってデッドロックを回避できる」という対策方法は、設計の基本として頻出の知識です。さらに、トランザクションの同時実行によって引き起こされる問題(更新消失のほか、未確定データを読み込んでしまう「ダーティリード」など)と、それを防ぐためのトランザクション分離レベル(アイソレーションレベル)の関係についての理解も深く問われます。

関連する用語

排他制御に関連する用語としては、一連の処理単位である「トランザクション」、データ処理の信頼性を担保するルール「ACID特性」、永久の待ち状態を招く「デッドロック」、読み取り時のみに用いる「共有ロック」、更新時に他を排除する「占有ロック」などがあり、これらを網羅的に理解することがデータベースの設計や試験対策において重要となります。

読んだ内容を10問練習と実技で確認

記事で理解した用語を、StudyQuestの演習とクラウド実技ラボで定着させます。

10問練習 実技ラボ