2012-07-17 5 views
5

Utilizzo SQL Server 2012 e ho scritto una piccola stored procedure con transazione di rollback. La mia procedura è la seguente:se @@ Trancount> 0 non funziona

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
@EmpId int, 
@EmployeeName varchar(50), 
@DeptId int 
AS 
BEGIN 
BEGIN TRY 

insert into Departments values (@DeptId, 'Testing 1'); 
insert into Employees values (@EmpId, @EmployeeName, @DeptId); 

END TRY 
BEGIN CATCH 

--log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

IF @@TRANCOUNT > 0 
BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
END 
END 

Come si può vedere, nella condizione Se, quando @@ TRANCOUNT> 0, sto cercando di rollback della transazione, ma quando eseguo la procedura, la dichiarazione è rollback mai eseguito, ho eseguito il debug della procedura e il valore di @@ TRANCOUNT è 1. Ma non riesco ancora a capire perché non funzioni. E ho avuto modo di sapere che non abbiamo bisogno di usare start tran e end tran per il rollback.

Qualcuno può aiutarmi a risolvere questo problema.

EDIT

Scusa se ho dimenticato di dire che, un errore si verifica nella seconda dichiarazione dell'inserto.

risposta

5

Hai avviato una transazione implicita. per eseguire il rollback, è necessario avviare una transazione esplicita (BEGIN TRANSACTION)

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
    @EmpId int, 
    @EmployeeName varchar(50), 
    @DeptId int 
AS 

BEGIN 

BEGIN TRY 
    BEGIN TRAN 
    insert into Departments values (@DeptId, 'Testing 1'); 
    insert into Employees values (@EmpId, @EmployeeName, @DeptId); 
    COMMIT TRAN 
END TRY 

BEGIN CATCH 
    --log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

    IF @@TRANCOUNT > 0 
    BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
    END 

END 
+0

si intende dire che senza transazione esplicita, il valore del @ trancount sarà sempre zero rito? ma mentre eseguivo il debug, ho visto il valore di @@ trancount come 1. ma non ho usato nessuna transazione iniziale e nessuna transazione. – Harsha

+1

Questa è una transazione di autocommit e non implicita, a meno che SET IMPLICIT_TRANSACTION ON o SET ANSI DEFAULTS ON, sebbene la risposta sia corretta. –