Основной шаблон транзакций в 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.