我有一个 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/