ネステッド・トランザクション
トランザクションの中にトランザクションを入れる仕組み。SQL では規定されているが、対応するRDBMSは少ない。PostgreSQL や MySQL はセーブポイントで代用しており、BEGIN の中の BEGIN は無視されるかエラーになることが多い。
PostgreSQL で BEGIN; ... BEGIN; ... と書くと「すでにトランザクションが進行中」という警告が出て、内側の BEGIN は無視される。SQL Server は入れ子を受け付けるが、コミットの意味合いが紛らわしい。内側の COMMIT は何もせず、外側の COMMIT だけが効くのだ。本来の入れ子トランザクションなら、内側を中止しても内側の変更だけが巻き戻る。PL/pgSQL の BEGIN-EXCEPTION ブロックは、実質的にセーブポイントによる入れ子トランザクションである。ORM も同じ手を使う。Django の atomic() は入れ子にでき、内部ではセーブポイントが使われる。