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