2012-05-24 507 views
5

我收到錯誤「ROLLBACK TRANSACTION請求沒有對應的BEGIN TRANSACTION」。如果任何刪除語句的行數爲零,我試圖回滾事務。以下是我的代碼。我究竟做錯了什麼?請幫助ROLLBACK TRANSACTION請求在sql server中沒有對應的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 @[email protected]@rowcount 
     delete from Login where userID = @staffID 
     set @[email protected]@rowcount 
     begin 
     if(@tempvar='S') 
       begin 
       delete from Specialist where specialistID = @staffID  
       set @[email protected]@rowcount 
       end 
     else if(@tempvar='H') 
       begin 
       delete from Helpdesk_Operator where helpdesk_OperatorID = @staffID 
       set @[email protected]@rowcount 
       end 
     commit transaction trans1 
     end 
     if(@rc1=0 or @rc2=0 or @rc3=0) 
     begin 
     rollback transaction trans1 
     end 

回答

5

如果提交事務,則不能再進行回滾。做一個或另一個:

if(@rc1=0 or @rc2=0 or @rc3=0) 
begin 
    rollback transaction trans1 
end else begin 
    commit transaction trans1 
end 
+0

爲什麼downvote?如果你不解釋你認爲是錯誤的,它不能改善答案。 – Guffa

4

您有commit transaction trans1正好在您回滾的if語句之前。在檢查計數之前,交易總是會被提交。

1

我相信commit transaction trans1總是被擊中,因此你將無法從這一點回滾。

1

如果您的事務已經提交,然後再實際進入您的提交語句,則會發生這種情況。 您可能在'COMMIT TRANSACTION'語句之前提供條件'If(@@ TRANCOUNT> 0)'。

對於如:

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

OR

BEGIN TRY 
    BEGIN TRANSACTION 
    SELECT 0 --Statements To Excecute  
    COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
    IF(@@TRANCOUNT>0) 
    ROLLBACK 
    END CATCH 
相關問題