268

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に問題があります。

実行中にエラーが発生した場合に両方のコマンドをロールバックするためにこれを実装するにはどうすればよいですか?

4

3 に答える 3

582

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  
于 2012-04-14T12:41:31.243 に答える
123

ストアドプロシージャの開始時に、SET XACT_ABORT ONを設定して、エラーが発生した場合にトランザクションを自動的にロールバックするようにSQLServerに指示する必要があります。省略またはOFFに設定されている場合は、各ステートメントの後に@@ ERRORをテストするか、 TRY...CATCHロールバックブロックを使用する必要があります。

于 2012-04-14T12:43:09.760 に答える