У меня есть 2 команды, и обе они должны быть выполнены правильно, или ни одна из них не выполнена. Я думаю, что мне нужна транзакция, но я не знаю, как правильно ее использовать.
В чем проблема со следующим скриптом?
BEGIN TRANSACTION [Tran1]
INSERT INTO [Test].[dbo].[T1]
([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)
UPDATE [Test].[dbo].[T1]
SET [Title] = N'az2' ,[AVG] = 1
WHERE [dbo].[T1].[Title] = N'az'
COMMIT TRANSACTION [Tran1]
GO
Команда INSERT
выполнена, но у UPDATE
команды есть проблема.
Как я могу реализовать это для отката обеих команд, если какая-либо из них имеет ошибку в выполнении?
BEGIN TRANSACTION [Tran1]
быть помещены внутрьTRY
? Во всяком случае - очень простой и элегантный кусок кода.В начале хранимой процедуры необходимо установить SET XACT_ABORT ON, чтобы Sql Server дал команду автоматически откатить транзакцию в случае ошибки. Если он опущен или имеет значение OFF, необходимо проверять @@ ERROR после каждого оператора или использовать блок отката TRY ... CATCH .
источник
XACT_ABORT
Легкий подход:
источник