Это значительное изменение по сравнению с первоначальным вопросом, которое делает его более сжатым и охватывает вопросы, поднятые в существующих ответах ...
Можно ли сделать несколько изменений в нескольких таблицах внутри одной транзакции и откатить только некоторые изменения?
В 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
Порядок важен, myLogSP должны происходить между и после myBusinessSP (myLogSP воспринимают изменения, сделанные myBusinessSP)
Также важно, чтобы все myBusinessSP происходили внутри одной транзакции, чтобы сохранить целостность базы данных и разрешить откат всех их изменений при необходимости.
Это как если бы я хотел, чтобы myLogSP вели себя так, как будто они не являются частью транзакции. Это просто неудобный факт, что они оказываются внутри одного (из-за необходимости вызова между myBusinessSP.)
EDIT:
Окончательный ответ «нет», единственный вариант - изменить код. Либо использовать табличные переменные для ведения журнала (поскольку переменные не откатываются), либо изменить бизнес-логику на Не требовать транзакций ...