diff options
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/plpgsql.sgml | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 6f880b705f8..071f5a87d3b 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -3746,6 +3746,17 @@ CALL transaction_test1(); </para> <para> + <application>PL/pgSQL</application> does not support savepoints + (<command>SAVEPOINT</command>/<command>ROLLBACK TO + SAVEPOINT</command>/<command>RELEASE SAVEPOINT</command> commands). + Typical usage patterns for savepoints can be replaced by blocks with + exception handlers (see <xref linkend="plpgsql-error-trapping"/>). + Under the hood, a block with exception handlers forms a + subtransaction, which means that transactions cannot be ended inside + such a block. + </para> + + <para> Special considerations apply to cursor loops. Consider this example: <programlisting> CREATE PROCEDURE transaction_test2() @@ -3770,7 +3781,10 @@ CALL transaction_test2(); evaluated at the first <command>COMMIT</command> or <command>ROLLBACK</command> rather than row by row. The cursor is still removed automatically after the loop, so this is mostly invisible to the - user. + user. But one must keep in mind that any table or row locks taken by + the cursor's query will no longer be held after the + first <command>COMMIT</command> or + <command>ROLLBACK</command>. </para> <para> @@ -3778,10 +3792,6 @@ CALL transaction_test2(); that are not read-only (for example <command>UPDATE ... RETURNING</command>). </para> - - <para> - A transaction cannot be ended inside a block with exception handlers. - </para> </sect1> <sect1 id="plpgsql-errors-and-messages"> |