2012-07-17 6 views
5

Ich benutze SQL Server 2012 und ich schrieb eine kleine gespeicherte Prozedur mit Rollback-Transaktion. Mein Verfahren ist wie folgt:Wenn @@ Trancount> 0 funktioniert nicht

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 

Wie Sie in der If-Bedingung sehen können, wenn @@ TRANCOUNT> 0, Ich versuche, die Transaktion rückgängig zu machen, aber wenn ich die Prozedur ausführen, die Rollback-Anweisung nie ausgeführt, habe ich die Prozedur debugged und der Wert von @@ TRANCOUNT ist 1. Aber ich verstehe immer noch nicht, warum es nicht funktioniert. Und ich habe gelernt, dass wir nicht beginnen müssen, tran und end tran für Rollback zu verwenden.

Kann mir jemand bei der Lösung dieses Problems helfen.

EDIT

Sorry, ich vergaß zu erwähnen, dass, tritt ein Fehler in der zweiten Insert-Anweisung.

Antwort

5

Sie haben eine implizite Transaktion gestartet. Um es zurückzurollen, müssen Sie eine explizite Transaktion (BEGIN TRANSACTION) starten

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

Sie wollen sagen, dass ohne explizite Transaktion, @@ trancount Wert wird immer Null Ritus sein? aber ich während des Debuggens, sah ich @ trancount Wert als 1. aber ich benutze keine begin tran und commit tran. – Harsha

+1

Dies ist eine Autocommit-Transaktion und keine implizite, außer SET IMPLICIT_TRANSACTION ON oder SET ANSI DEFAULTS ON, obwohl die Antwort korrekt ist. –

Verwandte Themen