Oracleモードでサポートされる分離レベル
OceanBaseデータベースは、Oracleモードにおいて以下の分離レベルをサポートしています:
- Read Committed:あるトランザクションが実行するクエリは、そのクエリ開始前にコミットされたデータのみを参照できます。Read Committedでは、非再現読み取りや幻覚読み取りといった異常状況を防ぐことはできません。
- Repeatable Read:トランザクション内で異なる時間に読み取られる同一データセットは一貫しています。ただし、幻覚読み取りという異常現象を防ぐことはできません。
- Serializable:あるトランザクションのクエリは、トランザクション開始前にコミットされたデータのみを参照できます。これは最も厳格な分離レベルであり、汚れた読み取り、非再現読み取り、幻覚読み取りという3つの異常状況を防ぐことができ、トランザクションはまるで直列実行されているかのように見えます。
OceanBaseデータベースのデフォルトの分離レベルはRead Committedです。
分離レベルの動作比較
OracleデータベースはRead CommittedとSerializableの分離レベルをサポートしており、OceanBaseデータベースのOracleモードにおけるこれら2つの分離レベルの動作は、Oracleデータベースと一致します。
分離レベルの設定方法
分離レベルの設定には、トランザクションレベル(Transaction level)とセッションレベル(Session level)の2種類の方法があります。
トランザクションレベル
SET TRANSACTION ISOLATION LEVEL [READ COMMITTED | SERIALIZABLE];このステートメントは新しいトランザクションを開始し、そのトランザクションの分離レベルを設定します。
セッションレベル
ALTER SESSION SET ISOLATION_LEVEL = [READ COMMITTED | SERIALIZABLE];
分離レベルの使用制限
トランザクション実行中に分離レベルを設定することは許可されておらず、そうした場合は以下のエラーが報告されます:
ERROR:OBE-01453: SET TRANSACTION must be first statement of transactionSerializable分離レベルを有効にする際には、グローバルタイムスタンプサービス(Global Timestamp Service)が有効であることを確認する必要があります。
Sessionはセッションレベルのトランザクション分離レベルを維持し、トランザクション開始時にセッションレベルのトランザクション分離レベルを取得します。この分離レベルは、トランザクションレベルの分離レベルによって上書きされる可能性があります。