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