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.
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
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. –