我有一个存储过程。由于种种常见原因,我使用了行之有效的try-tran块:
begin try
begin transaction
--(actual code here)
commit
end try
begin catch
if @@trancount > 0 rollback
-- do error handling stuff
-- re-throw the error
end catch
我希望这个spc能够被单独调用。我也不喜欢这样的事实,像select * from nonexistent_table
这样的语句将抛出错误266,该错误在 upper 级别中进行处理。因此,如果没有更高的级别,它将不会得到处理,并且会给我留下未完成的交易。为了解决这个问题,我使用了
SET XACT_ABORT ON
在try-catch块的开头。
现在,当我尝试将其包含在触发器中时,事情变得有些混乱。关键是,我希望触发器执行插入操作,然后在失败时调用proc而不取消插入。一种方法是通过在调用proc之前添加SET XACT_ABORT OFF
来覆盖默认触发状态。但是,该过程会将其设置为OFF,从而破坏了此解决方案。
据我所读,另一种方法是在proc调用之前在触发器中使用COMMIT
和BEGIN TRAN
(触发器应该自己执行COMMIT
。这是一个好的解决方案吗?在这种情况下应采取什么预防措施以最大程度地减少将来发生混乱的可能性?