トランザクションの開始
開始方法
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;
読み取り専用トランザクションではデータの変更はできません。そのため、読み書きトランザクションに比べて最適化が可能です。読み取り専用トランザクションはトランザクションコンテキストを作成しないため、ロールバック時にもクリーンアップ操作を実行する必要はありません。