2012-08-01 24 views
10

में नेस्टेड लेनदेन हाय, टीएसक्यूएल में नेस्टेड लेनदेन की मेरी वर्तमान समझ यह है कि यदि आपके पास एकाधिक लेनदेन (एक "बाहरी" लेनदेन के अंदर घनिष्ठ लेनदेन) हैं, तो सभी ट्रान्सएक्शन को "बाहरी" लेनदेन के साथ किया जाना चाहिए आखिरी होने के नाते) डेटाबेस में किए गए किसी भी बदलाव के लिए। यदि प्रतिबद्धता की संख्या खुले लेनदेन की संख्या से कम है तो किसी भी लेनदेन से संबंधित कोई भी परिवर्तन नहीं किया जाता है। क्या यह एक सही अवलोकन है कि नेस्टेड लेनदेन कैसे काम करते हैं?टीएसक्यूएल

उत्तर

12

COMMIT का आपका विवरण सही है।

Kalen Delaney has an article covering the same type of behavior that you describe.

लेकिन, जैसा कि Kalen के लेख में चर्चा, एक नेस्टेड लेन-देन के भीतर एक ROLLBACK पूरे बाहरी लेन-देन ही नहीं, भीतर की लेन-देन जहां रोलबैक होता है रोलबैक होगा।

नोट निम्न परिणाम:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

इस MSDN आलेख में वर्णित किया गया है, Nesting Transactions:

एक रोलबैक काम या एक रोलबैक लेन-देन में बयान नहीं है कि एक सौदे नाम वापस रोल सभी नेस्टेड लेन-देन और कमी @@ ट्रांस्काउंट 0। रोलबैक ट्रांज़ेक्शन जो लेनदेन नेस्टेड लेनदेन के सेट में बाहरी लेनदेन का नामका उपयोग करता हैसभी घोंसले लेनदेन और कमी @@ TRANCOUNT से 0 तक वापस रोल करता है। यदि आप पहले से ही लेनदेन में हैं, तो आप अनिश्चित हैं, तो @@ TRANCOUNT निर्धारित करें कि यह 1 या उससे अधिक है या नहीं। यदि @@ TRANCOUNT 0 है, तो आप लेन-देन में नहीं हैं।

3

संक्षेप में, आपका उत्तर हाँ है। Nesting Transactions से:

आंतरिक लेनदेन को कम करना SQL सर्वर डेटाबेस इंजन द्वारा अनदेखा किया जाता है। लेनदेन को या तो बाहरी या लेनदेन के अंत में की गई कार्रवाई पर आधारित या घुमाया गया है। यदि बाहरी लेनदेन किया जाता है, तो आंतरिक घोंसले लेनदेन भी प्रतिबद्ध हैं। यदि बाहरी लेनदेन वापस लुढ़का जाता है, तो आंतरिक लेनदेन व्यक्तिगत रूप से प्रतिबद्ध किए जाने के बावजूद सभी आंतरिक लेन-देन भी वापस लुढ़क दिए जाते हैं।

रोलबैक के संबंध में, केवल पूरे बाहरी लेनदेन को रोलबैक करने की अनुमति है।

संबंधित मुद्दे