这是对原始问题的重要修改,使其更加简洁并涵盖了现有答案提出的要点......
是否可以在单个事务中对多个表进行多次更改,并且只回滚一些更改?
在下面的 TSQL 中,我不希望“myLogSP”所做的任何更改都被回滚。但如有必要,各种 myBusinessSP 所做的所有更改都应回滚。
BEGIN TRANSACTION
EXEC myLogSP
EXEC @err = myBusinessSPa
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPb
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPc
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
COMMIT TRANSACTION
RETURN 0
顺序很重要,myLogSPs 必须发生在 myBusinessSPs 之间和之后(myLogSPs 接受 myBusinessSPs 所做的更改)
同样重要的是,所有 myBusinessSP 都发生在一个事务中以维护数据库完整性,并在必要时允许其所有更改回滚。
就好像我希望 myLogSP 表现得好像它们不是事务的一部分。它们恰好在一个内部(由于需要在 myBusinessSP 之间调用),这只是一个不便的事实。
编辑:
最终答案是“否”,唯一的选择是重新设计代码。要么使用表变量进行日志记录(因为变量不会回滚),要么将业务逻辑重新设计为不需要事务...