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