2012-07-17 29 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 

आप देख सकते हैं, अगर हालत में, जब TRANCOUNT> 0 @@, मैं लेनदेन रोलबैक करने के लिए कोशिश कर रहा हूँ, लेकिन जब मैं प्रक्रिया पर अमल करें, रोलबैक बयान है कभी निष्पादित नहीं किया गया, मैंने प्रक्रिया को डीबग कर दिया है और @@ TRANCOUNT का मान 1 है। लेकिन मुझे अभी भी समझ में नहीं आता कि यह क्यों काम नहीं कर रहा है। और मुझे पता चला कि हमें रोलबैक के लिए स्टार्ट ट्रैन और एंड ट्रैन का उपयोग करने की आवश्यकता नहीं है।

क्या कोई इस मुद्दे को हल करने में मेरी सहायता कर सकता है।

संपादित

खेद है कि मैं कि उल्लेख करना भूल गया, एक त्रुटि दूसरा डालने बयान में होता है।

उत्तर

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 के रूप में देखा। लेकिन मैं किसी भी प्रारंभिक ट्रैन का उपयोग नहीं कर रहा हूं और ट्रैन प्रतिबद्ध नहीं हूं। – Harsha

+1

यह एक ऑटोोकॉमिट लेनदेन है और निहित नहीं है, जब तक कि SET IMPLICIT_TRANSACTION चालू न हो, या सेट एएनएसआई डिफॉल्ट चालू हो, हालांकि उत्तर सही है। –