PRAGMA AUTONOMOUS_TRANSACTION v13
An SPL program can be declared as an autonomous transaction by specifying the following directive in the declaration section of the SPL block:
An autonomous transaction is an independent transaction started by a calling program. A commit or rollback of SQL commands within the autonomous transaction has no effect on the commit or rollback in any transaction of the calling program. A commit or rollback in the calling program has no effect on the commit or rollback of SQL commands in the autonomous transaction.
The following SPL programs can include PRAGMA AUTONOMOUS_TRANSACTION:
- Standalone procedures and functions
- Anonymous blocks
- Procedures and functions declared as subprograms within packages and other calling procedures, functions, and anonymous blocks
- Triggers
- Object type methods
The following are issues and restrictions related to autonomous transactions:
- Each autonomous transaction consumes a connection slot for as long as it is in progress. In some cases, this may mean that the
max_connections
parameter in thepostgresql.conf
file should be raised. - In most respects, an autonomous transaction behaves exactly as if it was a completely separate session, but GUCs (that is, settings established with
SET
) are a deliberate exception. Autonomous transactions absorb the surrounding values and can propagate values they commit to the outer transaction. - Autonomous transactions can be nested, but there is a limit of 16 levels of autonomous transactions within a single session.
- Parallel query is not supported within autonomous transactions.
- The Advanced Server implementation of autonomous transactions is not entirely compatible with Oracle databases in that the Advanced Server autonomous transaction does not produce an ERROR if there is an uncommitted transaction at the end of an SPL block.
The following set of examples illustrates the usage of autonomous transactions. This first set of scenarios show the default behavior when there are no autonomous transactions.
Before each scenario, the dept
table is reset to the following initial values:
Scenario 1a – No autonomous transactions with only a final COMMIT
This first set of scenarios show the insertion of three rows starting just after the initial BEGIN
command of the transaction, then from within an anonymous block within the starting transaction, and finally from a stored procedure executed from within the anonymous block.
The stored procedure is the following:
The PSQL session is the following:
After the final commit, all three rows are inserted:
Scenario 1b – No autonomous transactions, but a final ROLLBACK
The next scenario shows that a final ROLLBACK
command after all inserts results in the rollback of all three insertions:
Scenario 1c – No autonomous transactions, but anonymous block ROLLBACK
A ROLLBACK
command given at the end of the anonymous block also eliminates all three prior insertions:
This next set of scenarios shows the effect of using autonomous transactions with PRAGMA AUTONOMOUS_TRANSACTION
in various locations.
Scenario 2a – Autonomous transaction of anonymous block with COMMIT
The procedure remains as initially created: