同時実行制御(ドウジギョウセイチヨウ)とは | 意味や読み方など丁寧でわかりやすい用語解説
同時実行制御(ドウジギョウセイチヨウ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
どうじこうにゅうせいぎょ (ドウジコウニュウセイギョ)
英語表記
Concurrency Control (コンカレンシー コントロール)
用語解説
同時実行制御とは、複数のユーザーやプログラムが同時にシステム内のデータにアクセスする際に、データの整合性(正確性や一貫性)を保つための仕組みである。現代の多くのシステムでは、複数の利用者が同時に情報を閲覧したり更新したりすることが一般的であり、このような状況でデータの破損や不整合を防ぐことは非常に重要となる。例えば、銀行システムで同じ口座から二人が同時に引き出しを行ったり、ECサイトで在庫が残り一つの商品を複数の利用者が同時に購入しようとしたりする際に、適切な同時実行制御がなければ、誤った残高が記録されたり、実際には存在しない商品を販売してしまったりといった問題が発生する可能性がある。同時実行制御は、これらの潜在的な問題を未然に防ぎ、システムの信頼性を確保するために不可欠な技術である。
同時実行制御の具体的な目的は、複数のトランザクションが同時に同じデータにアクセスする際に発生しうる様々なデータ不整合の問題を防ぐことにある。トランザクションとは、一連の処理を一つのまとまりとして扱い、その処理全体が成功するか(コミット)、失敗するか(ロールバック)のどちらかになることを保証する概念である。
同時実行で発生しうる主要な問題には、以下のようなものがある。 ダーティリード(Dirty Read):まだ確定していない(コミットされていない)別のトランザクションの変更途中のデータを読み取ってしまう問題。もしその変更が最終的に取り消された(ロールバックされた)場合、誤ったデータを元に処理を進めてしまうことになる。 ノンリピータブルリード(Non-repeatable Read):あるトランザクション内で同じデータを複数回読み取った際に、途中で別のトランザクションによってデータが変更・コミットされ、読み取るたびに結果が変わってしまう問題。 ファントムリード(Phantom Read):ある条件でデータを検索した際に、途中で別のトランザクションによってその条件に合致する新たなデータが追加・コミットされ、同じ条件で再検索すると結果の行数が増えてしまう問題。 ロストアップデート(Lost Update):複数のトランザクションが同時に同じデータを更新しようとした際に、片方のトランザクションの更新内容が、後からコミットされた別のトランザクションの更新によって上書きされ、失われてしまう問題。
これらの問題を解決するために、主に二つのアプローチが用いられる。一つは「ロック(Locking)」であり、もう一つは「多版型同時実行制御(MVCC: Multi-Version Concurrency Control)」である。
ロックは、データへのアクセスを排他的に制御する手法である。あるトランザクションが特定のデータにアクセスする際、そのデータに「鍵(ロック)」をかけることで、他のトランザクションからのアクセスを制限する。ロックには大きく分けて、データの読み取りを許可しつつ書き込みを制限する「共有ロック(Shared Lock、Sロック)」と、データの読み書きの両方を制限する「排他ロック(Exclusive Lock、Xロック)」がある。共有ロックは複数のトランザクションが同時に取得できるが、排他ロックは一度に一つのトランザクションしか取得できない。トランザクションは、必要なデータに対して適切なロックを取得し、処理が完了してコミットまたはロールバックされるまでロックを保持する。これにより、上述したデータ不整合の問題を防ぐことができる。ただし、ロックを適切に管理しないと、複数のトランザクションが互いに相手のロック解除を待ち続けて処理が進まなくなる「デッドロック(Deadlock)」という問題が発生する可能性がある。これを回避するため、デッドロックの検出と、片方のトランザクションを強制的にロールバックするなどの解決策がシステムに組み込まれている。
多版型同時実行制御(MVCC)は、ロックとは異なるアプローチで同時実行制御を実現する手法である。MVCCでは、データが更新されるたびに元のデータを上書きするのではなく、新しいバージョンのデータを作成して履歴として保持する。これにより、読み取りを行うトランザクションは、常に自身のトランザクション開始時点、あるいは特定の時点でのデータのスナップショット(特定の時点のデータ状態のコピー)を参照できる。このため、書き込み処理が読み取り処理をブロックしたり、読み取り処理が書き込み処理をブロックしたりすることが少なくなり、並行処理性能の向上が期待できる。特に、データの読み取りが多いシステムにおいて有効な手法である。MVCCは、読み取り処理が古いバージョンのデータを参照するため、ダーティリードやノンリピータブルリードといった問題を防ぎやすい。
これらの制御手法は、データベースシステムにおいて「分離レベル(Isolation Level)」として提供されることが多い。分離レベルは、SQL標準によって定義されており、Read Uncommitted、Read Committed、Repeatable Read、Serializableの4段階がある。Read Uncommittedは最も分離度が低くダーティリードを許容するが性能は高い。Serializableは最も分離度が高く、全てのデータ不整合を防ぐが性能は低い。システム設計者は、アプリケーションの要件と性能のトレードオフを考慮して適切な分離レベルを選択する必要がある。