在事务中封装语句是否包括它触发的触发器?
Does encapsulating a statement in a transaction include the triggers it fires?
我有一个 INSERT
,它会触发一个 TRIGGER
,它会 UPDATE
另一个 TABLE
的属性。我需要确保如果 INSERT
成功并且 TRIGGER
中的 UPDATE
不成功,那么整个事情应该回滚。
将 INSERT
封装在事务中是否保证了这一点?
如果没有,我该怎么做?
触发器是包含原始 INSERT
的数据库事务的一部分。
交易中的任何错误(未处理)将导致整个交易回滚,就像什么都没发生过一样。这将包括导致触发器 运行.
的 INSERT
因此您无需做任何事情;它开箱即用。
您可以通过设置 SAVEPOINT
s 并使用 ROLLBACK TO SAVEPOINT
(或使用 PL/pgSQL 中的 BEGIN ... EXCEPTION ... END
块来显式处理事务内的错误引擎盖下也一样)。
要触发异常,运行 导致错误的 SQL 语句(如 SELECT 1/0
)或使用 PL/pgSQL 中的 RAISE EXCEPTION
语句(其他程序语言也有类似的方法)。
我有一个 INSERT
,它会触发一个 TRIGGER
,它会 UPDATE
另一个 TABLE
的属性。我需要确保如果 INSERT
成功并且 TRIGGER
中的 UPDATE
不成功,那么整个事情应该回滚。
将 INSERT
封装在事务中是否保证了这一点?
如果没有,我该怎么做?
触发器是包含原始 INSERT
的数据库事务的一部分。
交易中的任何错误(未处理)将导致整个交易回滚,就像什么都没发生过一样。这将包括导致触发器 运行.
的INSERT
因此您无需做任何事情;它开箱即用。
您可以通过设置 SAVEPOINT
s 并使用 ROLLBACK TO SAVEPOINT
(或使用 PL/pgSQL 中的 BEGIN ... EXCEPTION ... END
块来显式处理事务内的错误引擎盖下也一样)。
要触发异常,运行 导致错误的 SQL 语句(如 SELECT 1/0
)或使用 PL/pgSQL 中的 RAISE EXCEPTION
语句(其他程序语言也有类似的方法)。