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
コマンドに問題があります。
いずれかのコマンドの実行中にエラーが発生した場合に、両方のコマンドをロールバックするには、これをどのように実装すればよいでしょうか?
ベストアンサー1
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