लेन-देन में त्रुटियों को संभालें

Complete

संरचित अपवाद हैंडलिंग त्रुटियों के लिए परीक्षण करने और त्रुटियों को संभालने के लिए TRY/CATCH निर्माण का उपयोग करता है। लेन-देन के साथ अपवाद हैंडलिंग का उपयोग करते समय, TRY / CATCH ब्लॉक के संबंध में COMMIT या ROLLBACK कीवर्ड को सही स्थान पर रखना महत्वपूर्ण है।

लेन-देन करें

संरचित अपवाद हैंडलिंग के साथ हस्तांतरण का उपयोग करते समय, COMMIT TRANSACTION को TRY ब्लॉक के अंदर निम्न कोड उदाहरण में रखें:

BEGIN TRY
 BEGIN TRANSACTION
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION
END TRY 

रोलबैक लेनदेन

संरचित अपवाद हैंडलिंग के साथ उपयोग किए जाने पर, ROLLBACK TRANSACTION को CATCH ब्लॉक के अंदर निम्न कोड उदाहरण में रखें:

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	ROLLBACK TRANSACTION;
END CATCH;

XACT_STATE

किसी सक्रिय लेन-देन को वापस लाने से बचने के लिए, XACT_STATE फ़ंक्शन का उपयोग करें. XACT_STATE निम्न मान लौटाता है:

मान देता है मतलब
1 वर्तमान अनुरोध में एक सक्रिय, प्रतिबद्ध उपयोगकर्ता लेनदेन है।
0 कोई सक्रिय लेनदेन नहीं।
-1 वर्तमान अनुरोध में एक सक्रिय उपयोगकर्ता हस्तांतरण है, लेकिन एक त्रुटि उत्पन्न हुई है जिसके कारण हस्तांतरण को एक असंगत लेनदेन के रूप में वर्गीकृत किया गया है।

XACT_STATE का उपयोग रोलबैक आदेश से पहले, यह जाँचने के लिए किया जा सकता है कि हस्तांतरण सक्रिय है या नहीं.

निम्न कोड कैच ब्लॉक के भीतर उपयोग किए जा रहे XACT_STATE फ़ंक्शन को दिखाता है ताकि लेनदेन केवल तभी वापस लिया जाए जब कोई सक्रिय उपयोगकर्ता लेनदेन हो।

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.SimpleOrders(custid, empid, orderdate) 
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.SimpleOrderDetails(orderid,productid,unitprice,qty) 
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	IF (XACT_STATE()) <> 0
    	BEGIN
        ROLLBACK TRANSACTION;
    	END;
	ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;