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
.