触发器执行失败时如何回滚Invoices表的修改?
需求与触发器改造方案
需求说明
我有两张表:Invoices表和Outputs表。要求在Invoices表完成更新后,同步更新Outputs表;并且当Outputs表更新失败时,回滚Invoices表的修改。
现有触发器代码
ALTER TRIGGER [dbo].[Invoices_InputUpdate] ON [dbo].[Invoices] AFTER UPDATE AS BEGIN DECLARE @InvoiceId INT; SELECT @InvoiceId = InvoiceId From inserted UPDATE Outputs SET InvoiceModified=1 WHERE InvoiceId = @InvoiceId END
改造后的触发器代码(支持事务回滚)
ALTER TRIGGER [dbo].[Invoices_InputUpdate] ON [dbo].[Invoices] AFTER UPDATE AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; -- 开启后,执行出错时自动回滚事务 BEGIN TRY BEGIN TRANSACTION; -- 适配批量更新场景,原代码仅处理单条数据,通过关联inserted实现批量同步 UPDATE o SET o.InvoiceModified = 1 FROM Outputs o INNER JOIN inserted i ON o.InvoiceId = i.InvoiceId; COMMIT TRANSACTION; END TRY BEGIN CATCH -- 捕获错误并回滚事务,保证数据一致性 IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; -- 抛出错误(可根据业务需求选择是否保留) THROW; END CATCH END
关键改进点
- 开启
SET XACT_ABORT ON:确保执行过程中出现严重错误时自动触发事务回滚 - 替换为批量更新逻辑:解决原代码仅支持单条更新的问题,适配
Invoices表批量更新的场景 - 引入
TRY/CATCH块:捕获Outputs表更新时的错误,触发回滚操作,保证两张表的数据状态一致
内容的提问来源于stack exchange,提问作者3PCO
相关产品推荐
相关产品推荐

