PL/SQLにサブプログラムがあります。
PRAGMA AUTONOMOUS_TRANSACTION
指令。
このサブプログラム(同じように使用される一連のプロシージャがありますが、このプラグマはありません)でのみ、このプロシージャを呼び出したトランザクションの変更は表示されないようです。
理解できません。
他の手順では、このプラグマディレクティブを使用している場合を除き、トランザクション内で行われた変更を確認します。個別のコミットを実行できるのは料金ですか?
はい、自律型トランザクションはまさにそれです-自律的であり、それが呼び出されるトランザクションとは別のものです。どちらも、コミットされるまで相手の変更を確認できません。自律型トランザクションを使用する正当な理由はほとんどありません。頭に浮かぶ主な有効な使用法は、エラーログです。多くの場合、特に「テーブルが変化している」例外を回避するためのトリガーで誤用されます。手順における自律トランザクションの目的は何ですか?
AUTONOMOUS_TRANSACTION
親トランザクションが失敗した場合にロールバックされたくないロギングを単に実行していないプラグマを持つコードは、ほとんどの場合バグです。
自律型トランザクションは真に自律的です。それらは親トランザクションから完全に独立しています。自律型トランザクション内のコードは、自律型トランザクションが開始される前に現在のセッションで進行中だったトランザクションを含む、他のトランザクションで行われたコミットされていない変更を認識できないと予想されます。
SQL Serverのバックグラウンドを使用している場合、自律型トランザクションはネストされたトランザクションとはまったく異なる動物です。
自律トランザクションサブプログラムは、独自の独立したトランザクションで実行されます。これらは、メインのトランザクションに戻る前に、追加の接続を開いて手続き型ロジックを実行した場合とまったく同じように機能します。
それらは独立しているため、親トランザクションからのコミットされていない変更は表示されません。
Oracleでは、PRAGMA AUTONOMOUS_TRANSACTIONSを使用すると、ストアドプロシージャを「ファイアアンドフォーゲット」プロセスとして実行できます。これは、ロールバックが許可されていないため、特定のプロシージャ内でコミットを行う場合にも必要です。
通常、トリガーからのコミットを含むストアドプロシージャを参照している場合は、最初にこの行を含める必要があります。また、コミットが含まれている場合にWebサービスから呼び出されるストアドプロシージャでこれが必要になることもあります。