MySQLモードでサポートされている分離レベル
OceanBaseデータベースは、MySQLモードで以下の4つの分離レベルをサポートしています:
読み取り未コミット(Read Uncommitted):あるトランザクションが、別のトランザクションによって未コミットのデータを読み取ることができます。トランザクションAがデータ項目を変更したもののまだコミットしていない場合、トランザクションBはその未コミットの変更を即座に確認できます。トランザクションAが変更をロールバック(操作を取り消す)した場合、トランザクションBが読み取ったデータは、以前存在したが現在は存在しない「ダーティ」なデータになります。現在のOceanBaseは、*読み取り未コミット(Read Uncommitted)*分離レベルを構文的にのみサポートしており、ユーザーが読み取り未コミットの分離レベルを指定した場合、実際には読み取りコミットが使用されます。
読み取りコミット(Read Committed):あるトランザクションが実行するクエリでは、そのクエリ開始前にコミットされたデータのみを確認できます。読み取りコミットは、不重复读(RRU)および幻読(Phantom Read)の2つの異常状況を防ぐことはできません。
繰り返し読み取り可能(Repeatable Read):トランザクション内で異なる時間に読み取った同一のデータは一貫しています。
連携可能(Serializable):この分離レベルは、OracleデータベースのSerializableに類似しており、厳密な意味でのSerializableではありません。
OceanBaseデータベースのデフォルトの分離レベルは**読み取りコミット(Read Committed)**です。
分離レベルの動作比較
MySQLデータベースは読み取り未コミット、読み取りコミット、繰り返し読み取り可能、連携可能の4つの分離レベルをサポートしていますが、OceanBaseデータベースのMySQLモードは、これら4つの分離レベルにおいてMySQLデータベースとは一定の差異があります。
読み取り未コミット: MySQLデータベースは読み取り未コミットをサポートしていますが、OceanBaseデータベースは読み取り未コミットの構文のみをサポートしています。現在のOceanBaseは、*読み取り未コミット(Read Uncommitted)*分離レベルを構文的にのみサポートしており、ユーザーが読み取り未コミットの分離レベルを指定した場合、実際には読み取りコミットが使用されます。
読み取りコミット: 読み取りコミット分離レベルで行が更新条件を満たすかどうかを判断する際、MySQLデータベースは半一貫性読み取りを使用します。行が並行トランザクションによって更新されている場合、MySQLデータベースは並行トランザクションの終了を待ち、最新のバージョンで更新が必要かどうかを判断します。一方、OceanBaseデータベースでは、並行トランザクションが更新しているかどうかに関係なく、常にステートメントスナップショット内のバージョンに基づいて行が更新条件を満たすかどうかを判断します。
繰り返し読み取り可能: 繰り返し読み取り可能分離レベルで書き込み競合が発生した場合、MySQLデータベースでは後から書き込んだトランザクションが先に書き込んだトランザクションの終了を待ちます。先に書き込んだトランザクションがロールバックした場合、後から書き込んだトランザクションは元のバージョンで直接更新します。先に書き込んだトランザクションがコミットした場合、後から書き込んだトランザクションは新しくコミットされたバージョンで更新を行います。OceanBaseデータベースでは、後から書き込んだトランザクションが先に書き込んだトランザクションの終了を待ちます。先に書き込んだトランザクションがロールバックした場合、後から書き込んだトランザクションは元のバージョンで直接更新します。先に書き込んだトランザクションがコミットした場合、後から書き込んだトランザクションはロールバックしてエラーを返します。
連携可能: MySQLデータベースの連携可能分離レベルは2段階ロック(2PL)を使用し、厳密な連携可能性を保証します。OceanBaseデータベースの連携可能分離レベルはスナップショット分離(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グローバルレベルの分離レベルは、セッションレベルの分離レベルによって上書きされます。