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