लेन-देन और बैचों की तुलना करें
लेनदेन के व्यवहार के लिए TRY/CATCH ब्लॉक के भीतर संलग्न T-SQL बैचों के व्यवहार की तुलना करना सहायक होता है।
दो ग्राहक ऑर्डर सम्मिलित कर रहा है, जो निम्न कोड पर विचार करें, जिसमें SalesLT.SalesOrderHeader तालिका में एक पंक्ति और SalesLT.SalesOrderDetail तालिका में एक या अधिक पंक्तियों की आवश्यकता होती है. सभी INSERT स्टेटमेंट TRY ब्लॉक के भीतर संलग्न हैं।
- यदि पहला इन्सर्ट विफल हो जाता है, तो निष्पादन कैच ब्लॉक में चला जाता है और आगे कोई कोड निष्पादित नहीं होता है।
- यदि दूसरा इन्सर्ट विफल हो जाता है, तो निष्पादन कैच ब्लॉक में चला जाता है और आगे कोई कोड निष्पादित नहीं होता है। हालाँकि, पहला इंसर्ट सफल रहा, और डेटाबेस को असंगत स्थिति में छोड़कर वापस नहीं लिया गया। ऑर्डर के लिए एक पंक्ति डाली गई थी, लेकिन ऑर्डर विवरण के लिए कोई पंक्ति नहीं थी.
BEGIN TRY
INSERT INTO dbo.Orders(custid, empid, orderdate)
VALUES (68, 9, '2021-07-12');
INSERT INTO dbo.Orders(custid, empid, orderdate)
VALUES (88, 3, '2021-07-15');
INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
VALUES (1, 2, 15.20, 20);
INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
VALUES (999, 77, 26.20, 15);
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
END CATCH;
लेनदेन के भीतर कोड को लागू करने के लिए इसकी तुलना करें। TRY/CATCH ब्लॉक का उपयोग अभी भी त्रुटि हैंडलिंग के लिए किया जाता है, हालांकि ऑर्डर और OrderDetails टेबल के लिए INSERT स्टेटमेंट BEGIN TRANSACTION/COMMIT TRANSACTION कीवर्ड के भीतर संलग्न हैं। यह सुनिश्चित करता है कि सभी बयानों को एकल लेनदेन के रूप में माना जाता है, जो या तो सफल या विफल होता है। या तो आदेश और OrderDetails तालिका दोनों के लिए एक पंक्ति लिखी जाती है, या न ही पंक्ति सम्मिलित की जाती है. इस तरह, डेटाबेस कभी भी असंगत स्थिति में नहीं हो सकता है।
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO dbo.Orders(custid, empid, orderdate)
VALUES (68,9,'2006-07-15');
INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
VALUES (99, 2,15.20,20);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
ROLLBACK TRANSACTION;
END CATCH;