Базовый шаблон для транзакций в sqlserver

Если я просто оберну свой запрос следующим образом:

BEGIN TRANSACTION



COMMIT TRANSACTION

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

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

Но это похоже на много работы, чтобы проверять IF(@@ERROR ‹> 0) после каждой вставки/обновления.


person Community    schedule 14.11.2008    source источник


Ответы (4)


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

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
person Jeremiah Peschka    schedule 14.11.2008
comment
Мне очень нравится это решение. Есть комментарии по недостаткам/недостаткам...? - person Mauro; 15.11.2011
comment
Единственный недостаток, который я обнаружил, заключается в том, чтобы решить, как лучше всего реагировать на ошибки, возникшие в транзакции. Этот код будет откатывать все открытые/ожидающие транзакции (если вы используете вложенные транзакции), поэтому он может вызвать странные вещи в вызывающем коде, который, как ожидает ваш уровень доступа к данным, сможет откатить саму транзакцию. - person Jeremiah Peschka; 16.11.2011
comment
Как насчет использования XACT_STATE вместо @@TRANCOUNT для определения необходимости отката? - person kman; 19.04.2016

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

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

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

person Nathan Feger    schedule 14.11.2008

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

SET XACT_ABORT ON

BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
person Mladen Prajdic    schedule 14.11.2008

Для управления транзакциями вы используете начало, фиксацию и откат. Вы начинаете транзакцию, вводя 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's previous value ('123') No changes were made.
person GluedHands    schedule 14.11.2008