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