SAVEPOINT と ROLLBACK TO SAVEPOINT 構文

SAVEPOINT identifier
ROLLBACK [WORK] TO SAVEPOINT identifier
RELEASE SAVEPOINT identifier

InnoDB は SQL ステートメント SAVEPOINTROLLBACK TO SAVEPOINTRELEASE SAVEPOINT そして ROLLBACK の任意 WORK キーワードをサポートします。

SAVEPOINT ステートメントは identifier の名前を利用して、名前が付けられたトランザクション セーブポイントを設定します。もし現在のトランザクションが同名のセーブポイントを持っていれば、古いセーブポイントは削除され新しいものが設定されます。

ROLLBACK TO SAVEPOINT ステートメントは、名づけられたセーブポイントにトランザクションをロールバックします。セーブポイントの設定後に行に対して現在のトランザクションが行った変更はロールバック内で解除されますが、InnoDB はセーブポイントの後にメモリに格納された新しい行ロックのリリースは 行いません。(新しく挿入された行には、その行内に格納されているトランザクション ID によってロック情報が保持されるので、そのロックはメモリの中で別々に格納される訳ではないという事に注意してください。この場合、行ロックは取り消しの中でリリースされます。)名づけられたセーブポイントよりも後で設定されたセーブポイントは削除されます。

もし ROLLBACK TO SAVEPOINT ステートメントが次のエラーを返したら、指定された名前のセーブポイントは存在しないという事を意味します。

ERROR 1181: Got error 153 during ROLLBACK

RELEASE SAVEPOINT ステートメントは、現在のトランザクションのセーブポイント セットから、名づけられたセーブポイントを除外します。コミットもロールバックも起きません。もしセーブポイントが存在しなければ、これはエラーになります。

もし COMMIT や、セーブポイントに名前をつけない ROLLBACK を実行すると、現在のトランザクションの全てのセーブポイントは削除されます。

MySQL 5.0.17 から、ストアド ファンクションが呼び出されたりトリガが作動した時に、新しいセーブポイント レベルが作成されます。以前のレベルのセーブポイントは無効になる為、新しいレベルとの間でセーブポイントの衝突が起きません。ファンクションやトリガが終了する時に、それらが作成したセーブポイントはリリースされ、以前のセーブポイント レベルが保持されます。