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