トランザクションの開始
開始方法
OceanBaseデータベースでは、Oracleモードでトランザクションを開始するには、以下の2つの方法があります:
自動開始
トランザクションが開始されていないセッションでDMLステートメント(
SELECTを除く)、DCLステートメント、またはDDLステートメントを実行すると、デフォルトでトランザクションが開始されます。手動開始
Oracleデータベースの使用方法と互換性があるほか、OceanBaseデータベースでは手動でトランザクションを開始することもできます。構文は以下のとおりです:
START TRANSACTION [READ ONLY | READ WRITE]; BEGIN [WORK] ;
実行結果
トランザクションが開始されると、システムはユーザーが指定した設定またはデフォルト設定に基づいてトランザクション情報を初期化します:
ユーザー情報を設定します。
分離レベルを設定します。
デフォルトのトランザクション分離レベルは
READ COMMITTEDです。SET TRANSACTIONなどのステートメントを使用して分離レベルを指定できます。SERIALIZABLEレベルのトランザクションに対して、トランザクション単位のスナップショットバージョンを設定します。
トランザクションのコミット
現在のトランザクションをコミットする構文は以下のとおりです:
obclient> COMMIT [WORK];
COMMITステートメントを入力すると、トランザクションのコミットプロセスに入り、トランザクションの変更をコミットしてトランザクションを終了します。 OceanBaseデータベースでは、典型的な場合、トランザクションのコミットには「2フェーズコミット」が必要です。2フェーズコミットの詳細については、2フェーズコミットを参照してください。
トランザクションのロールバック
現在のトランザクションをロールバックする構文は以下のとおりです:
ROLLBACK [WORK];
ROLLBACKステートメントを入力すると、トランザクションのロールバックプロセスに入り、トランザクションの変更を削除してトランザクションを終了します。
具体的なプロセスは以下のとおりです:
各参加者はMemTable上の自身の変更を削除し、行ロックを解放し、参加者コンテキストをクリーンアップします。
参加者がクリーンアップに成功すると、スケジューラーにメッセージを返します。スケジューラーはすべての参加者からクリーンアップ成功メッセージを収集した後、スケジューラーのコンテキストをクリーンアップします。
読み取り専用トランザクション
読み取り専用トランザクションの無効化
読み取り専用ステートメントを最適化するため、セッションでトランザクションが開始されていない場合、SELECTステートメントを実行すると、トランザクションを開始せずに読み取り専用モードに入ります。読み取り専用トランザクションの無効化では、トランザクションコンテキストなどの処理をスキップし、必要な情報のみを読み取ってユーザーにデータを返します。
読み取り専用トランザクションのスナップショット取得方法は、現在のセッションの分離レベルによって決まります。
読み取り専用トランザクションの無効化の例は以下のとおりです:
SELECT * FROM t1; // トランザクションを開始せずに読み取り専用
SELECT * FROM t2; // トランザクションを開始せずに読み取り専用
INSERT INTO t1 VALUES(1); // トランザクションを開始
読み取り専用トランザクション
以下のステートメントを入力すると、読み取り専用トランザクションを開始できます。
obclient> START TRANSACTION READ ONLY;
読み取り専用トランザクションではデータの変更はできないため、読み書きトランザクションよりも最適化が可能です。また、読み取り専用トランザクションではトランザクションコンテキストが作成されないため、ロールバック時にもクリーンアップ処理を実行する必要はありません。