データの並行性
トランザクションの処理能力をより効果的に向上させるため、データベースはユーザーが同一データに対してトランザクションごとに並行してアクセスおよび変更を行うことを許可します。このようなデータの並行性について、その意味を定義する必要があります。
データの一貫性
データベースは、各変更ごとに新しいバージョンを生成することで、読み取りの排他性を回避しています。これをマルチバージョン並行制御(MVCC)と呼びます。異なるトランザクションバージョンについても、このようなデータの複数バージョンに対する意味を定義し、ユーザーが一貫したデータベース状態、すなわちデータの一貫性スナップショットを確認できるようにする必要があります。
説明
データの一貫性は、ACIDのC(Consistency)と同じではありません。
並行制御
上記の二つの意味を、並行制御モデルと呼びます。これは、ACIDのI(Isolation level)に相当します。
最も単純な並行制御は、直列(serial)実行です。直列実行とは、あるプロセスが別のプロセスが操作を完了し(トリガー操作への応答を受信するまで)、次の操作を開始しないことを指します。しかし、これは明らかに高い並行性の要求には適合しません。そのため、研究者たちは直列化可能(serializable)という概念を提案しました。これは、トランザクション内の複数の操作を並列(非直列)で実行することができますが、最終的には直列実行と同じ結果を得る必要があります。
一般的な実装メカニズムには、2段階ロックと楽観的ロックの2種類があります。前者は、排他的にロックを追加することで他のトランザクションによる競合的な変更を制限し、デッドロック検出メカニズムによってループを形成するトランザクションをロールバックすることで、無環状を保証します。後者は、コミット時の検出フェーズで、異常を引き起こす可能性のあるすべてのトランザクションをロールバックすることで、異常の発生を防ぎます。
しかし実際には、上記の2つの実装メカニズムが提供する直列化可能な分離レベルはパフォーマンスに大きな影響を与えるため、一般的には許容可能なループ条件を一部許容することで一部の異常を露呈させ、トランザクションのパフォーマンスとスケーラビリティを向上させます。その中でも、スナップショット読み取りと既コミット読み取りは、異常を許容する一般的な並行制御であり、OceanBaseデータベースもこれを採用しています。トランザクション分離レベル(Isolation)を設計する上で重要なポイントの一つは、分離レベルの抽象化をどのように定義するかであり、これによりユーザーはパフォーマンスと意味の使いやすさのバランスを得ることができます。