SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
InnoDB
は、SQL ステートメント SAVEPOINT
、ROLLBACK TO SAVEPOINT
、RELEASE SAVEPOINT
のほか、ROLLBACK
のオプションの WORK
キーワードをサポートしています。
SAVEPOINT
ステートメントは、identifier
の名前を持つ名前付きのトランザクションセーブポイントを設定します。 現在のトランザクションに同じ名前を持つセーブポイントが含まれている場合、古いセーブポイントは削除され、新しいセーブポイントが設定されます。
ROLLBACK TO SAVEPOINT
ステートメントは、トランザクションを終了することなく、そのトランザクションを指定されたセーブポイントにロールバックします。 セーブポイントが設定されたあとに現在のトランザクションが行に対して行なった変更はロールバックで元に戻されますが、InnoDB
は、セーブポイントのあとにメモリーに格納された行ロックを解放しません。 (新しく挿入された行の場合、ロック情報は、その行に格納されているトランザクション ID によって伝達されます。ロックが個別にメモリーに格納されるわけではありません。 この場合、行ロックは Undo で解放されます。) 指定されたセーブポイントよりあとで設定されたセーブポイントは削除されます。
ROLLBACK TO SAVEPOINT
ステートメントが次のエラーを返した場合は、指定された名前を持つセーブポイントが存在しないことを示しています。
ERROR 1305 (42000): SAVEPOINT identifier does not exist
RELEASE SAVEPOINT
ステートメントは、指定されたセーブポイントを現在のトランザクションの一連のセーブポイントから削除します。 コミットまたはロールバックは発生しません。 そのセーブポイントが存在しない場合はエラーになります。
COMMIT
、またはセーブポイントを指定しない ROLLBACK
を実行した場合は、現在のトランザクションのすべてのセーブポイントが削除されます。
ストアドファンクションが呼び出されるか、またはトリガーがアクティブ化されると、新しいセーブポイントレベルが作成されます。 以前のレベルにあるセーブポイントは使用できなくなるため、新しいレベルのセーブポイントとは競合しません。 関数またはトリガーが終了すると、その関数またはトリガーによって作成されたセーブポイントはすべて解放され、以前のセーブポイントレベルがリストアされます。