У нас есть клиентское приложение, которое выполняет SQL на SQL Server 2005, например:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Отправляется одной длинной строковой командой.
В случае сбоя одной из вставок или сбоя какой-либо части команды SQL Server откатывает транзакцию? Если он не откатывается, нужно ли отправлять вторую команду для его отката?
Я могу дать конкретную информацию о API и языке, который я использую, но я думаю, что SQL Server должен отвечать одинаково для любого языка.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
источник
источник
Ответы:
Вы можете поставить
set xact_abort on
перед своей транзакцией, чтобы убедиться, что sql автоматически откатывается в случае ошибки.источник
xact_abort
находится на уровне соединения.Вы правы в том, что вся транзакция будет откатана. Вы должны выполнить команду, чтобы откатить его.
Вы можете обернуть это в
TRY CATCH
блок следующим образомисточник
try
), но после этого код завершился ошибкой. Там нет больше транзакции, но вы все еще собираетесь вcatch
.Вот код с получением сообщения об ошибке при работе с MSSQL Server 2016:
источник
DECLARE @Var TYPE; SET @Var = ERROR;
для повышения ошибок в SQL Server 2005. В противном случае приведенный выше код для повышения ошибок работает и для старых БД. Попытка присвоить значение по умолчанию локальной переменной - вот что вызывало проблему.Из статьи MDSN « Управление транзакциями ( компонент Database Engine)» .
В вашем случае он откатит всю транзакцию, если какая-либо из вставок потерпит неудачу.
источник
Нет.
Конечно, вы должны выдать
ROLLBACK
вместоCOMMIT
.Если вы хотите решить, следует ли совершать или откатывать транзакцию, вы должны удалить
COMMIT
предложение из оператора, проверить результаты вставок, а затем выполнить одинCOMMIT
или вROLLBACK
зависимости от результатов проверки.источник
Named Pipes
илиTCP
) разрывает соединение. Когда соединение разрывается,SQL Server
останавливает все запущенные в данный момент команды и откатывает транзакцию.