Основной шаблон транзакций в sqlserver
Если я просто переношу свой запрос с помощью:
BEGIN TRANSACTION
COMMIT TRANSACTION
Если в этом что-то не получится, будет ли он автоматически откатываться?
От взгляда на другой код они, похоже, проверяют наличие ошибки, если есть ошибка, тогда они выполняют оператор GOTO, который затем вызывает ROLLBACK TRANSACTION
Но это похоже на выделение работы, чтобы проверить IF (@@ERROR < > 0) после каждой вставки/обновления.
Ответы
Ответ 1
Я обычно делаю что-то подобное в моих хранимых процедурах. Это держит вещи красивыми и безопасными и проходит через любые ошибки, с которыми я сталкиваюсь.
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- Code goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE
@ERROR_SEVERITY INT,
@ERROR_STATE INT,
@ERROR_NUMBER INT,
@ERROR_LINE INT,
@ERROR_MESSAGE NVARCHAR(4000);
SELECT
@ERROR_SEVERITY = ERROR_SEVERITY(),
@ERROR_STATE = ERROR_STATE(),
@ERROR_NUMBER = ERROR_NUMBER(),
@ERROR_LINE = ERROR_LINE(),
@ERROR_MESSAGE = ERROR_MESSAGE();
RAISERROR('Msg %d, Line %d, :%s',
@ERROR_SEVERITY,
@ERROR_STATE,
@ERROR_NUMBER,
@ERROR_LINE,
@ERROR_MESSAGE);
END CATCH
Ответ 2
да, важно явно отменить транзакцию в случае, если она не работает.
Я обычно говорю своему сыну, что вам нужно только чистить зубы, которые вы хотите сохранить.
В этом случае вам нужно только отменить команды, которые вы не хотите выполнять.
Ответ 3
Это автоматически откат транзакции в случае ошибки
SET XACT_ABORT ON
BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
Ответ 4
Для управления транзакциями вы используете begin, commit и rollback. Вы начинаете транзакцию, предоставляя BEGIN TRANSACTION. Затем вы помещаете различные запросы SQL, которые вам нужны. Затем вы завершаете транзакцию путем выдачи фиксации или отката. COMMIT TRANSACTION выполнит все изменения, внесенные вами в базу данных после инструкции BEGIN, и сделайте их постоянными, так сказать. ROLLBACK TRANSACTION отменит все изменения, внесенные вами в базу данных после инструкции BEGIN. Однако он не изменит значения переменных.
Пример:
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
COMMIT TRANSACTION
--//column now has a value of 'ABC'
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
ROLLBACK TRANSACTION
--//column still has it previous value ('123') No changes were made.