Transazione annidata
Una transazione dentro un'altra. Standardizzata in SQL ma poco supportata dai RDBMS. PostgreSQL e MySQL la emulano con i savepoint. Un begin dentro un begin è spesso un no-op o un errore.
PostgreSQL: BEGIN; ... BEGIN; ... produce il WARNING «there is already a transaction in progress» e il BEGIN interno viene ignorato. SQL Server supporta le transazioni annidate, ma la semantica del commit è confusa (il commit interno non fa nulla, vale solo quello esterno). Nella vera semantica annidata, l'abort interno annulla soltanto lo stato interno. In PostgreSQL, tramite PL/pgSQL, i blocchi BEGIN-EXCEPTION sono di fatto transazioni annidate realizzate con savepoint. Gli ORM astraggono il problema: atomic() di Django può essere annidato e internamente usa i savepoint.