Я помещал set xact_abort on
в операторы SQL-команд и заметил, что он не откатывает обновления, вставки и т. Д. В моем C# SqlCommand
при ошибке. Взято с this сообщение. MSDN гласит:Ошибка SQL не откат всего SqlCommand
Когда SET XACT_ABORT включена, если Transact-SQL заявление вызывает ошибку во время выполнения, вся транзакция завершается, и откат.
Общий формат моего SQl запроса:
set xact_abort on
INSERT INTO Table1
UPDATE Table2
UPDATE Table3
UPDATE Table4
--Finally
SELECT someValue
я заметил, что при ошибке моя команда SQL была не откат. Частная ошибка заключается в том, что длина данных одного параметра превышала указанную длину столбцов. Я использую SqlCommand
и SqlParameter
для создания SQL-запросов.
Я не ищу обработку исключений в SQL, но очень важно, чтобы любые ошибки не вносили никаких изменений в базу данных.
Обычно ошибки включают в себя: столбец не существует, неправильный тип данных, данные будут усечены из-за длины и т.д.
Должен ли я использовать что-то другое, чем set xact_abort on
? Заранее спасибо!
Почему бы не поймать 'SqlException' на вашем C# и откатить транзакцию вручную? – Andrew
В нижней части [этой ссылки] (https://msdn.microsoft.com/en-us/library/ms188792.aspx) вам все равно нужно обернуть инструкции в вызовы 'BeginTransaction' и' EndTransaction'. Похоже, это просто избавляет вас от необходимости отвечать на ошибки и вызывать «Rollback» самостоятельно. – DonBoitnott
Если вы работаете с несколькими сценариями, другим способом управлять им будет [dbup] (http://dbup.github.io). – lloyd