このようなコミットをプログラムに配置するとどのような影響がありますか?
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。