2012-05-24 17 views
5

Viene visualizzato l'errore "La richiesta ROLLBACK TRANSACTION non ha una corrispondente BEGIN TRANSACTION". Sto tentando di eseguire il rollback della transazione se il conteggio delle righe per qualsiasi istruzione di eliminazione è zero. Dato di seguito è il mio codice. Che cosa sto facendo di sbagliato? Si prega di aiutareLa richiesta ROLLBACK TRANSACTION non ha un errore BEGIN TRANSACTION corrispondente 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 

risposta

5

Se si esegue il commit della transazione, non è possibile eseguire un rollback. Fare uno o l'altro:

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

Perché il downvote? Se non spieghi cosa pensi sia sbagliato, non può migliorare la risposta. – Guffa

4

Hai commit transaction trans1 subito prima dell'istruzione if per il rollback. La transazione sarà sempre impegnata prima di controllare i conteggi.

1

Credo che il commit transaction trans1 sia sempre colpito, quindi non sarà possibile eseguire il rollback da quel punto.

1

Questo accade se la transazione è già stato commesso prima che realmente andare in vostra dichiarazione commettere. Si potrebbe dare una condizione 'If (@ TRANCOUNT> 0)' prima dell'istruzione 'COMMIT TRANSACTION'.

Per esempio:

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

O

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