SAVEPOINTidentifier
ROLLBACK [WORK] TO SAVEPOINTidentifier
RELEASE SAVEPOINTidentifier
InnoDB
は SQL ステートメント
SAVEPOINT
、ROLLBACK TO
SAVEPOINT
、RELEASE 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 から、ストアド ファンクションが呼び出されたりトリガが作動した時に、新しいセーブポイント レベルが作成されます。以前のレベルのセーブポイントは無効になる為、新しいレベルとの間でセーブポイントの衝突が起きません。ファンクションやトリガが終了する時に、それらが作成したセーブポイントはリリースされ、以前のセーブポイント レベルが保持されます。