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