SAVE TRANSACTION vs BEGIN TRANSACTION (SQL Server) как правильно вкладывать транзакции

У меня есть хранимая процедура, которая должна установить точку сохранения, чтобы при определенных обстоятельствах она могла отменить все, что она сделала, и вернуть код ошибки вызывающей стороне, или принять / зафиксировать ее и вернуть ее успешной работе. Но мне нужно, чтобы он работал независимо от того, начал ли абонент уже транзакцию или нет. Док крайне запутан в этом вопросе. Вот то, что я думаю, будет работать, но я не уверен во всех последствиях.

Дело в том, что этоStored Procedure (SP) вызывается другими. Так что я не знаю, начали ли они транзакцию или нет ... Даже если я требую, чтобы пользователи начали транзакцию, чтобы использовать мой SP, у меня все еще есть вопросы о правильном использованииSave Points ...

Мой SP проверит, выполняется ли транзакция, и если нет, начните сBEGIN TRANSACTION, Если транзакция уже выполняется, она вместо этого создаст точку сохранения сSAVE TRANSACTION MySavePointNameи сохранить тот факт, что это то, что я сделал.

Затем, если мне придется откатить свои изменения, если я сделалBEGIN TRANSACTION раньше, тогда я будуROLLBACK TRANSACTION, Если я сделал точку сохранения, то я будуROLLBACK TRANSACTION MySavePointName, Этот сценарий, кажется, работает отлично.

Здесь я немного запутался - если я захочу продолжить работу, которую я сделал, если я начну транзакцию, я выполнюCOMMIT TRANSACTION, Но если я создал точку сохранения? Я пыталсяCOMMIT TRANSACTION MySavePointName, но затем вызывающая сторона пытается зафиксировать свою транзакцию и получает ошибку:

Запрос COMMIT TRANSACTION не имеет соответствующей BEGIN TRANSACTION.

Поэтому мне интересно - точка сохранения может быть откатана (это работает:ROLLBACK TRANSACTION MySavePointName НЕ откатит транзакцию вызывающего абонента). Но, возможно, никогда не нужно «совершать» это? Он просто остается там, на случай, если вам нужно откатиться к нему, но исчезает, когда исходная транзакция зафиксирована (или откатана)?

Если есть «лучший» способ «вложить» транзакцию, пожалуйста, пролите немного света. Я не понял, как с гнездомBEGIN TRANSACTION но только откат или фиксация моей внутренней транзакции. КажетсяROLLBACK всегда будет откат к верхней транзакции, в то время какCOMMIT просто декременты@@trancount.

Ответы на вопрос(3)

Ваш ответ на вопрос