6

私は SQL Server 2012 を使用しており、ロールバック トランザクションを使用する小さなストアド プロシージャを作成しました。私の手順は次のとおりです。

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
@EmpId int,
@EmployeeName varchar(50),
@DeptId int
AS
BEGIN
BEGIN TRY

insert into Departments values (@DeptId, 'Testing 1');
insert into Employees values (@EmpId, @EmployeeName, @DeptId);

END TRY
BEGIN CATCH

--log error here
Goto Error_Rollback
END CATCH

Error_Rollback:

IF @@TRANCOUNT > 0
BEGIN
    print 'rolling back transaction' /* <- this is never printed */
    ROLLBACK TRAN
END
END

ご覧のとおり、If 条件で @@TRANCOUNT > 0 の場合、トランザクションをロールバックしようとしていますが、プロシージャを実行すると、ロールバック ステートメントは実行されず、プロシージャと @ の値をデバッグしました@TRANCOUNT は 1 です。しかし、なぜ機能しないのかまだわかりません。そして、ロールバックに begin tran と end tran を使用する必要がないことを知りました。

誰でもこの問題を解決するのを手伝ってくれますか?

編集

言い忘れましたが、2番目のinsert文でエラーが発生しています。

4

1 に答える 1

8

暗黙のトランザクションを開始しました。ロールバックするには、明示的なトランザクションを開始する必要があります (BEGIN TRANSACTION)

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
  @EmpId int,
  @EmployeeName varchar(50),
  @DeptId int
AS

BEGIN

BEGIN TRY
  BEGIN TRAN
  insert into Departments values (@DeptId, 'Testing 1');
  insert into Employees values (@EmpId, @EmployeeName, @DeptId);
  COMMIT TRAN
END TRY

BEGIN CATCH  
  --log error here
 Goto Error_Rollback
END CATCH

Error_Rollback:

  IF @@TRANCOUNT > 0
  BEGIN
    print 'rolling back transaction' /* <- this is never printed */
    ROLLBACK TRAN
  END

END
于 2012-07-17T08:24:31.797 に答える