postgresql - 在事务中封装语句是否包括它触发的触发器?

标签 postgresql triggers transactions consistency

我有一个 INSERT 将触发一个 TRIGGER,它将 UPDATE 另一个 TABLE 上的一个属性。我需要确保如果 INSERT 成功并且 TRIGGER 中的 UPDATE 不成功,那么应该回滚整个过程。

在事务中封装 INSERT 是否可以保证这一点?

如果没有,我该怎么做?

最佳答案

触发器是包含原始INSERT 的数据库事务的一部分。

事务中的任何错误(未处理的)都将导致整个事务回滚,就像什么都没发生过一样。这将包括导致触发器运行的 INSERT

因此您无需做任何事情;开箱即用,它会按照您想要的方式工作。

您可以通过设置 SAVEPOINT 并使用 ROLLBACK TO SAVEPOINT(或使用 BEGIN ... EXCEPTION .. .END block 在 PL/pgSQL 中,它在后台做同样的事情)。

要触发异常,要么运行导致错误的 SQL 语句(如 SELECT 1/0),要么在 PL/pgSQL 中使用 RAISE EXCEPTION 语句(有对于其他过程语言也是类似的方式)。

关于postgresql - 在事务中封装语句是否包括它触发的触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49978569/

相关文章:

PostgreSQL 客户端无法解析 Docker 容器中的主机名

ruby-on-rails - 有没有办法将 facets 与 pg_search gem 一起使用

php - 当有人在某个表中插入或更新行时运行脚本

oracle - oracle中如何删除包含特殊字符的触发器?

java - 如何使用 J2ME 读取数据库?

postgresql - 邮政吉斯 : Query to get list of multiple neighbour polygon which area sum equal to 42

java - 代码来知道文件是否已下载

go - 在 DDD 中,一个实体和存储库可以从多个表中提取吗?

python - 如何让我的 App Engine 事务重试?

ios - 处理 Realm 事务