2012-05-24 9 views
5

Ich bekomme den Fehler "ROLLBACK TRANSACTION Anfrage hat keine entsprechende BEGIN TRANSACTION". Ich versuche, die Transaktion zurückzusetzen, wenn die Zeilenanzahl für eine Löschanweisung Null ist. Unten ist mein Code angegeben. Was mache ich falsch? Bitte helfenROLLBACK TRANSACTION Anfrage hat keine entsprechende BEGIN TRANSACTION Fehler in SQL-Server

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 

Antwort

5

Wenn Sie die Transaktion festschreiben, können Sie keinen Rollback durchführen. Führen Sie eine oder das andere:

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

Warum die downvote? Wenn Sie nicht erklären, was Sie für falsch halten, kann es die Antwort nicht verbessern. – Guffa

4

Sie haben commit transaction trans1 direkt vor Ihrer if-Anweisung für das Rollback. Die Transaktion wird immer ausgeführt, bevor Sie die Anzahl überprüfen.

1

Ich glaube, die commit transaction trans1 wird immer getroffen, daher können Sie von diesem Punkt aus kein Rollback durchführen.

1

Dies geschieht, wenn Sie Ihre Transaktion bereits begangen wurde, bevor Sie tatsächlich Ihr gehen in begehen Aussage. Sie können eine Bedingung "If (@@ TRANCOUNT> 0)" vor Ihrer Anweisung "COMMIT TRANSACTION" angeben.

Für ZB:

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

ODER

BEGIN TRY 
    BEGIN TRANSACTION 
    SELECT 0 --Statements To Excecute  
    COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
    IF(@@TRANCOUNT>0) 
    ROLLBACK 
    END CATCH 
Verwandte Themen