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