2012-07-17 137 views
5

我正在使用SQL Server 2012,並且使用回滾事務編寫了一個小型存儲過程。我的程序如下:如果@@ Trancount> 0不起作用

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 

正如你所看到的,在If條件,@@ TRANCOUNT> 0時,我試圖回滾事務,但是當我執行的程序,回滾語句從未執行過,我已經調試過程並且@@ TRANCOUNT的值是1.但我仍然不明白爲什麼它不起作用。而且我知道我們不需要使用begin tran和end tran來回滾。

任何人都可以幫助我解決這個問題。

編輯

對不起,我忘了提及的是,在第二個INSERT語句中出現錯誤。

回答

5

您已開始隱式事務。 (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

您的意思是說,沒有明確的交易,@@ trancount價值將永遠是零禮儀?但我在調試時,我看到@@ trancount的值爲1,但我沒有使用任何開始tran和commit tran。 – Harsha 2012-07-17 08:57:57

+1

這是一個自動提交事務,不是隱式事務,除非SET IMPLICIT_TRANSACTION ON或SET ANSI DEFAULTS ON,儘管答案是正確的。 – 2014-07-08 10:36:40