2012-05-24 18 views
5

Recibo el error "La solicitud de ROLLBACK TRANSACTION no tiene la correspondiente BEGIN TRANSACTION". Estoy intentando deshacer la transacción si el recuento de filas para cualquier declaración de eliminación es cero. A continuación se encuentra mi código. ¿Qué estoy haciendo mal? Por favor, ayudaLa solicitud de ROLLBACK TRANSACTION no tiene un error BEGIN TRANSACTION correspondiente en el servidor sql

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 

Respuesta

5

Si realiza la transacción, no puede realizar una reversión. Haga uno u otro:

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

Por qué la downvote? Si no explica lo que piensa que está mal, no puede mejorar la respuesta. – Guffa

4

Tienes commit transaction trans1 justo antes de su sentencia if para la reversión. La transacción siempre se confirmará antes de verificar los recuentos.

1

Creo que el commit transaction trans1 siempre recibe un golpe, por lo tanto, no podrá deshacer desde ese punto.

1

Esto sucede si su transacción ya se ha confirmado antes de entrar realmente en su declaración de compromiso. Puede dar una condición 'If (@@ TRANCOUNT> 0)' antes de su declaración 'COMPRAR TRANSACCIÓN'.

Por ejemplo:

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 
Cuestiones relacionadas