自律ルーチンは、最初のSQLステートメントからトランザクションを開始します。あるトランザクションが終了すると、次のSQLステートメントで別のトランザクションが開始されます。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
前回のコミットまたはロールバック以降に実行されたすべてのSQLステートメントは、現在のトランザクションを構成します。自律トランザクションを制御するには、次のステートメントを使用してください。これらのステートメントは現在の(アクティブな)トランザクションにのみ適用されます:
COMMITROLLBACK [TO savepoint_name]SAVEPOINT savepoint_name
自律ルーチンへの進入と退出
自律ルーチンの実行可能部分に進入すると、メイントランザクションは一時停止されます。ルーチンを退出すると、メイントランザクションは再開されます。
アクティブな自律トランザクションをコミットまたはロールバックせずに退出しようとすると、データベースは例外を発生させます。その例外が処理されない場合、または他の未処理の例外によってトランザクションが終了した場合、そのトランザクションはロールバックされます。
ルーチンを正常に退出するには、すべての自律トランザクションを明示的にコミットまたはロールバックする必要があります。ルーチン(またはルーチンが呼び出すルーチン)に未処理のトランザクションがある場合、PLは例外を発生させ、未処理のトランザクションはロールバックされます。
自律トランザクションのコミットとロールバック
COMMIT と ROLLBACK はアクティブな自律トランザクションを終了できますが、自律ルーチンを退出することはできません。あるトランザクションが終了すると、次のSQLステートメントで別のトランザクションが開始されます。自律ルーチンが複数の COMMIT ステートメントを発行した場合、複数の自律トランザクションを含むことができます。
セーブポイント
セーブポイントは、それを定義したトランザクションにのみ有効です。メイントランザクションで定義されたセーブポイントは、その自律トランザクションで定義されたセーブポイントとは無関係です。実際、メイントランザクションと自律トランザクションは同じセーブポイント名を使用できます。
現在のトランザクションでマークされたセーブポイントまでしかロールバックできません。自律トランザクション内では、メイントランザクションでマークされたセーブポイントまでロールバックすることはできません。そのため、自律ルーチンを退出してメイントランザクションを再開する必要があります。
メイントランザクション内で、自律トランザクションを開始する前にマークされたセーブポイントまでロールバックしても、その自律トランザクションはロールバックされません。自律トランザクションはメイントランザクションから完全に独立していることを覚えておいてください。
自律トランザクション内のエラー回避
一般的なエラーを回避するために、以下の点を覚えておいてください:
自律トランザクションがメイントランザクションが所有するリソースにアクセスしようとすると、デッドロックが発生します。データベースは自律トランザクション内で例外を発生させ、その例外が処理されない場合はロールバックされます。
アクティブな自律トランザクションをコミットまたはロールバックせずに退出しようとすると、データベースは例外を発生させます。その例外が処理されない場合、トランザクションはロールバックされます。
自律トランザクションを開始すると、自律ルーチン内で
PIPE ROWステートメントを実行することはできません。PIPE ROWステートメントを実行する前に、自律トランザクションを閉じる必要があります。これは通常、PIPE ROWステートメントを実行する前に自律トランザクションをコミットまたはロールバックすることで実現されます。