Правильное использование транзакций в SQL Server 2008
у меня есть 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
The insert
команда выполнена, а проблемы. Как я могу реализовать это для отката обеих команд, если какая-либо из них имеет ошибку при выполнении?
3 ответа:
добавьте блок try / catch, если транзакция завершится успешно, он зафиксирует изменения, если транзакция завершится неудачно, транзакция будет откатана:
BEGIN TRANSACTION [Tran1] BEGIN TRY 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] END TRY BEGIN CATCH ROLLBACK TRANSACTION [Tran1] END CATCH
в начале хранимой процедуры нужно поставить УСТАНОВИТЬ XACT_ABORT НА чтобы Sql Server автоматически откатывал транзакцию в случае ошибки. Если опущен или установлен в off, нужно протестировать @ @ ERROR после каждого утверждения или использования попробовать ... Поймать откат блок.
простой подход:
CREATE TABLE T ( C [nvarchar](100) NOT NULL UNIQUE, ); SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error. SELECT * FROM T; -- Check before. BEGIN TRAN INSERT INTO T VALUES ('A'); INSERT INTO T VALUES ('B'); INSERT INTO T VALUES ('B'); INSERT INTO T VALUES ('C'); COMMIT TRAN SELECT * FROM T; -- Check after. DELETE T;