6

我收到错误“ROLLBACK TRANSACTION 请求没有相应的 BEGIN TRANSACTION”。如果任何删除语句的行数为零,我正在尝试回滚事务。下面给出的是我的代码。我究竟做错了什么?请帮忙

alter procedure delete_staff(@staffID varchar(10))
as
declare @tempvar varchar(50), @staffName varchar(50), @jobTitle varchar(50), @dept varchar(50)
begin transaction trans1
        declare @rc1 int
        declare @rc2 int
        declare @rc3 int
        select @tempvar = left(@staffID,1) from Staff
        delete from staff where staffID = @staffID
        set @rc1=@@rowcount
        delete from Login where userID = @staffID 
        set @rc2=@@rowcount
        begin
        if(@tempvar='S')
                begin
                delete from Specialist where specialistID = @staffID    
                set @rc3=@@rowcount
                end
        else if(@tempvar='H')
                begin
                delete from Helpdesk_Operator where helpdesk_OperatorID = @staffID
                set @rc3=@@rowcount
                end
        commit transaction trans1
        end
        if(@rc1=0 or @rc2=0 or @rc3=0)
        begin
        rollback transaction trans1
        end
4

4 回答 4

6

如果您提交事务,则不能进行回滚。做一个或另一个:

if(@rc1=0 or @rc2=0 or @rc3=0)
begin
  rollback transaction trans1
end else begin
  commit transaction trans1
end
于 2012-05-24T18:50:18.730 回答
4

你有commit transaction trans1权利在你的 if 语句之前进行回滚。在您检查计数之前,将始终提交事务。

于 2012-05-24T18:47:55.777 回答
2

如果您的事务在您实际进入提交语句之前已经提交,则会发生这种情况。您可以在您的“COMMIT TRANSACTION”语句之前给出条件“If (@@TRANCOUNT>0)”。

例如:

 BEGIN TRANSACTION
  SELECT 0--Statements To Excecute
  ROLLBACK
  IF(@@TRANCOUNT>0)
  COMMIT TRANSACTION

或者

  BEGIN TRY
  BEGIN TRANSACTION
  SELECT 0 --Statements To Excecute     
  COMMIT TRANSACTION
  END TRY
  BEGIN CATCH
  IF(@@TRANCOUNT>0)
  ROLLBACK
  END CATCH
于 2014-09-18T12:32:32.480 回答
1

我相信commit transaction trans1总是受到打击,因此您将无法从那时起回滚。

于 2012-05-24T18:48:47.140 回答