自律トランザクションとは、別のトランザクション(親トランザクション)によって開始される独立したトランザクションです。自律トランザクションはSQL操作を実行し、親トランザクションをコミットまたはロールバックすることなく、自身をコミットまたはロールバックします。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供しています。
自律トランザクションは別のトランザクションによって開始されますが、ネストされたトランザクションではありません。その理由は以下の通りです:
それは親トランザクションとトランザクションリソース(例えばロック)を共有しません。
それは親トランザクションに依存しません。例えば、親トランザクションがロールバックされると、ネストされたトランザクションもロールバックされますが、自律トランザクションはロールバックされません。
それがコミットした変更は、他のトランザクションに対して即座に可視化されます。
親トランザクションがコミットされる前に、ネストされたトランザクションがコミットした変更は他のトランザクションに対して可視化されません。
自律トランザクションで発生した例外は、ステートメントレベルのロールバックではなく、トランザクションレベルのロールバックを引き起こします。
自律トランザクションの利点
開始後、自律トランザクションは完全に独立しています。それは親トランザクションとロック、リソース、またはコミット依存関係を共有しません。たとえ親トランザクションがロールバックされても、イベントを記録したり、再試行カウンターをインクリメントしたりすることができます。
自律トランザクションを使用すると、モジュール化された再利用可能なソフトウェアコンポーネントを構築できます。自律トランザクションを格納されたサブルーチンにカプセル化できます。呼び出すアプリケーションは、その格納されたサブルーチンが実行する操作が成功したか失敗したかを知る必要はありません。
トランザクション環境
親トランザクションはネストされたルーチンとそのコンテキストを共有しますが、自律ルーチンとは共有しません。ある自律ルーチンが別の自律ルーチンを呼び出す場合(または再帰的に呼び出す場合)、そのルーチンはいかなるトランザクションコンテキストも共有しません。自律ルーチンが非自律ルーチンを呼び出す場合、これらのルーチンは同一のトランザクションコンテキストを共有します。
トランザクションの可視性
自律トランザクションがコミットされると、自律トランザクションが行った変更は他のトランザクションに対して可視化されます。分離レベルを READ COMMITTED(デフォルト)に設定すると、これらの変更は親トランザクションが再開されたときに親トランザクションに対して可視化されます。
親トランザクションの分離レベルを SERIALIZABLE に設定すると、親トランザクションが再開されたとき、その自律トランザクションが行った変更は親トランザクションに対して可視化されません。例:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
説明
- トランザクション属性は、トランザクション属性が設定されたトランザクションにのみ適用されます。
- カーソル属性は自律トランザクションの影響を受けません。
自律ルーチンの宣言
自律ルーチンを宣言するには、AUTONOMOUS_TRANSACTION コンパイル指示子を使用します。
読みやすさのために、AUTONOMOUS_TRANSACTION コンパイル指示子を宣言部の上部に配置することを推奨します。(宣言部の任意の位置でこのコンパイル指示子を使用できます。)
AUTONOMOUS_TRANSACTION コンパイル指示子をプログラムパッケージ全体またはADT全体に適用することはできませんが、プログラムパッケージ内の各サブルーチンまたはADT内の各メソッドに適用することはできます。