Почему T-SQL автоматически откатывает транзакцию при попытке обрезать размер столбца? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть вопрос о поведении T-SQL, который я не могу найти объяснения.

Я установил простую таблицу

create table SavedData (
    textData varchar(5)
)

, когда я запускаю следующий sqlпервая строка вставляется

begin transaction
    insert into SavedData values (1, 'asd')
    insert into SavedData values (1, 'asdasdad') //exception here
commit transaction

, но когда я их запускаю, строка не вставляется

begin transaction
    insert into SavedData values (1, 'asd')
    alter table SavedData alter column textData varchar(2) //exception here
commit transaction

В обоих случаях во втором выражении будет выдано исключение.Но почему конечный результат отличается?

1 Ответ

0 голосов
/ 26 июня 2018

Если вы хотите откатить транзакцию, при первом исключении вам нужно установить XACT_ABORT ON, См. Здесь

SET XACT_ABORT {ON |OFF}

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

Если у вас отключен параметр XACT_ABORT OFF (которыйпо умолчанию), тогда нет никакой гарантии, что вся транзакция будет откатана:

Когда SET XACT_ABORT установлен в ON, если инструкция Transact-SQL вызывает ошибку времени выполнения, вся транзакциязавершен и откат.

Когда SET XACT_ABORT выключен, в некоторых случаях откатывается только оператор Transact-SQL, вызвавший ошибку, и транзакция продолжает обрабатываться.В зависимости от серьезности ошибки можно выполнить откат всей транзакции, даже если для SET XACT_ABORT установлено значение OFF.ВЫКЛ - настройка по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...