SAVEPOINTidentifier
ROLLBACK [WORK] TO [SAVEPOINT]identifier
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
を実行すると、現在のトランザクションのすべてのセーブポイントは削除されます。
ストアドファンクションが呼び出されるか、またはトリガーが有効にされると、新しいセーブポイントレベルが作成されます。以前のレベルのセーブポイントは無効になるため、新しいレベルとの間でセーブポイントの衝突が起きません。ファンクションやトリガーが終了するときに、それらが作成したセーブポイントはリリースされ、以前のセーブポイントレベルが保持されます。