MySQLモードでサポートされる分離レベル
OceanBaseデータベースは、MySQLモードでは以下の4つの分離レベルをサポートしています:
Read Uncommitted:あるトランザクションが別のトランザクションによってコミットされていないデータを読み取ることができます。トランザクションAがデータ項目を変更したがまだコミットされていない場合、トランザクションBはこれらの未コミットの変更を即座に確認できます。トランザクションAが変更をロールバック(つまり、その操作をキャンセル)すると、トランザクションBが読み取ったデータは以前存在していたが現在は存在しない「ダーティ」データになります。現在のOceanBaseは、Read Uncommitted分離レベルを文法的にのみサポートしており、ユーザーがRead Uncommitted分離レベルを指定した場合、実際にはRead Committedが使用されます。
Read Committed:あるトランザクションが実行するクエリは、このクエリ開始前にコミットされたデータのみを確認できます。Read Committedは、不整合な読み取りや幻覚読み取りという2つの例外状況を防ぐことはできません。
Repeatable Read:トランザクション内で異なる時間に読み取られた同一のデータセットは一貫しています。
Serializable:この分離レベルはOracleデータベースのSerializableに似ていますが、厳密な意味でのSerializableではありません。
OceanBaseデータベースのデフォルトの分離レベルはRead Committedです。
分離レベルの動作比較
MySQLデータベースはRead Uncommitted、Read Committed、Repeatable Read、Serializableの4つの分離レベルをサポートしており、OceanBaseデータベースのMySQLモードはこれら4つの分離レベルにおいて、MySQLデータベースと一定の違いがあります。
Read Uncommitted: MySQLデータベースはRead Uncommittedをサポートしていますが、OceanBaseデータベースはRead Uncommittedの構文のみをサポートしています。現在のOceanBaseは、Read Uncommitted分離レベルを文法的にのみサポートしており、ユーザーがRead Uncommitted分離レベルを指定した場合、実際にはRead Committedが使用されます。
Read Committed: Read Committed分離レベルで行が更新条件を満たすかどうかを判断する際、MySQLデータベースは準一貫性読み取りを使用します。もし行が並行トランザクションによって更新されている場合、MySQLデータベースは並行トランザクションの終了を待ってから、最新バージョンで更新が必要かどうかを判断します。一方、OceanBaseデータベースでは、並行トランザクションが更新したかどうかに関係なく、常にステートメントスナップショット内のバージョンに基づいて行が更新条件を満たすかどうかを判断します。
Repeatable Read: Repeatable Read分離レベルで書き込み競合が発生した場合、MySQLデータベースでは後に書き込まれたトランザクションは先に書き込まれたトランザクションの終了を待ちます。先に書き込まれたトランザクションがロールバックされた場合、後に書き込まれたトランザクションは元のバージョンで直接更新します。先に書き込まれたトランザクションがコミットされた場合、後に書き込まれたトランザクションは新しくコミットされたバージョンで再度更新します。OceanBaseデータベースでは、後に書き込まれたトランザクションは先に書き込まれたトランザクションの終了を待ちます。先に書き込まれたトランザクションがロールバックされた場合、後に書き込まれたトランザクションは元のバージョンで直接更新します。先に書き込まれたトランザクションがコミットされた場合、後に書き込まれたトランザクションはロールバックされ、エラーが返されます。
Serializable: MySQLデータベースのSerializable分離レベルは2段階ロック(2PL)を使用し、厳密なシリアライゼーションを保証できます。OceanBaseデータベースのSerializable分離レベルはスナップショット分離(Snapshot Isolation)を使用し、厳密なシリアライゼーションを保証できません。
分離レベルの設定方法
分離レベルの設定には、グローバルレベルとセッションレベルの2種類の方法があります。
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL [READ COMMITTED | REPEATABLE READ | SERIALIZABLE | READ UNCOMMITTED];
分離レベルの使用制限
トランザクション実行中に分離レベルを設定することは許可されておらず、そうした場合は以下のエラーが報告されます:
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progressグローバルレベルの分離レベルは、セッションレベルの分離レベルによって上書きされる可能性があります。