लेन-देन में त्रुटियों को संभालें
संरचित अपवाद हैंडलिंग त्रुटियों के लिए परीक्षण करने और त्रुटियों को संभालने के लिए 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;