Базовый шаблон для транзакций в sqlserver - PullRequest
15 голосов
/ 14 ноября 2008

Если я просто заверну свой запрос:

BEGIN TRANSACTION



COMMIT TRANSACTION

Если внутри этого ничего не получится, произойдет ли автоматический откат?

Посмотрев на другой код, они, кажется, проверяют на наличие ошибки, если есть ошибка, тогда они делают инструкцию GOTO, которая затем вызывает ROLLBACK TRANSACTION

Но это похоже на большую работу, которую нужно проверять на IF (@@ ERROR <> 0) после каждой вставки / обновления.

Ответы [ 4 ]

28 голосов
/ 14 ноября 2008

Обычно я делаю что-то подобное в моих хранимых процедурах. Это делает вещи красивыми и безопасными и передает любые ошибки, с которыми я сталкиваюсь.

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
4 голосов
/ 14 ноября 2008

Это автоматически откатит транзакцию в случае отключения

SET XACT_ABORT ON

BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
4 голосов
/ 14 ноября 2008

да, важно явно откатить транзакцию в случае, если она не работает.

Я обычно говорю сыну, что тебе нужно только чистить зубы, которые ты хочешь сохранить.

В этом случае вам нужно только откатить команды, которые вы не хотите выполнять.

1 голос
/ 14 ноября 2008

Для управления транзакциями вы используете начало, фиксацию и откат. Вы начинаете транзакцию, предоставляя НАЧАЛО СДЕЛКИ. Затем вы помещаете различные операторы 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's previous value ('123') No changes were made.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...