如果存储过程在中间失败,那么从 SP 开头开始的更改是否会隐式回滚,或者我们是否必须编写任何显式代码来确保 SP 仅在数据库事务中运行?
严格来说,Postgres 并没有have 存储过程如 ISO/IEC 标准第 11 版之前的定义。该术语经常被错误地用来指代功能,它提供了与其他 RDBMS 提供的“存储过程”相同的功能(甚至更多)。主要区别在于事务处理。
True 存储过程最终在 Postgres 11 中引入:
功能 are atomic在 Postgres 中。它们总是在事务上下文中运行并成功或失败完全地.因此,人们无法在函数内开始或提交事务。和命令像VACUUM
, CREATE DATABASE
, or CREATE INDEX CONCURRENTLY
不允许不在事务上下文中运行。
PL/pgSQL 手册:
函数和触发器过程总是在一个
由外部查询建立的事务 - 它们无法启动或
提交该事务,因为他们没有上下文可以提交该事务
执行。但是,包含EXCEPTION
条款
有效地形成一个可以回滚的子事务,而无需
影响对外交易。
错误处理:
默认情况下,PL/pgSQL 函数中发生的任何错误都会中止
函数的执行,以及周围事务的执行
以及。您可以使用以下方法捕获错误并从中恢复:BEGIN
块与EXCEPTION
clause.
有例外情况, 包括但不仅限于:
-
写入日志文件的数据
-
对序列所做的更改
重要的:一些 PostgreSQL 数据类型和函数有特殊规则
关于交易行为。特别是,对
序列(因此使用声明的列的计数器serial
)
对所有其他交易立即可见并且不会滚动
如果进行更改的事务中止,则返回。
-
准备好的陈述
SQL小提琴 demo
-
dblink 调用(或类似)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)