このようなコミットをプログラムに配置するとどのような影響がありますか?
Oracleのドキュメントでは、COMMIT
について説明しています。 として:
目的
COMMIT
を使用します 現在のトランザクションを終了し、トランザクションで実行されたすべての変更を永続的に行うステートメント。トランザクションは、OracleDatabaseが単一ユニットとして扱う一連のSQL文です。このステートメントは、トランザクション内のすべてのセーブポイントを消去し、トランザクションロックを解放します。
PROCEDURE
が3つある場合 それぞれにCOMMIT
が含まれています ステートメントの場合、3つすべてを実行することはできません。後者で例外が発生した場合は、ROLLBACK
最初の2つからの変更はすでにCOMMIT
であるため、これらはすべて テッド。
原則として、禁止する必要があります COMMIT
を使用する PROCEDURE
で またはFUNCTION
ただし、呼び出し元はCOMMIT
に任せる必要があります トランザクション。複数のアクションをまとめることができます。
もちろん、このルールに違反したいユースケースもありますが、このルールを破る前に、それぞれのケースを個別に検討し、ビジネスロジックを完全に理解して、COMMIT
とは何かを理解する必要があります。 各インスタンスでテッド。
このトランザクションを
AUTONOMOUS_TRANSACTION
として行う必要があります ?
1つのユースケースはロギングです-PROCEDURE
があるかもしれません 別のPROCEDURE
を呼び出します ユーザーのアクションをログに記録し、最初のアクションが成功したか失敗したかに関係なく、アクションのログを保持し、ログがCOMMIT
であることを確認します。 テッド。この場合、ロギングPROCEDURE
AUTONOMOUS_TRANSACTION
である必要があります COMMIT
が含まれています ステートメントと呼び出し元のステートメントには、(おそらく)どちらも含まれていないはずです。
したがって、COMMIT
1つのPROCEDURE
常に必要であり、呼び出し元がCOMMIT
であるかどうかとは無関係です。 s他のデータは、PROCEDURE
を作成します AUTONOMOUS_TRANSACTION
。 PROCEDURE
の場合 sをバンドルしてから、ROLLBACK
グループとして、それらをAUTONOMOUS_TRANSACTION
にしたくない場合 s。