मैंने एमएसडीएन के माध्यम से ROLLBACK TRANSACTION और nesting transactions पर पढ़ा है। जबकि मुझे ROLLBACK TRANSACTION savepointname
का बिंदु दिखाई देता है, मुझे ROLLBACK TRANSACTION transactionname
समझ में नहीं आता है।"रोलबैक ट्रांज़ेक्शन name_transaction" का क्या मतलब है?
- यह केवल जब
transactionname
सबसे बाहरी लेन-देन है काम करता है ROLLBACK
हमेशा मूल रूप से वापस रोल पूरे लेन-देन "ढेर",savepointname
के मामले को छोड़कर, जैसा कि मैंने दस्तावेज़ पढ़ें, सिवाय एक बचत बिंदु के मामले में, ROLLBACK
सभी लेनदेन वापस ले जाता है (@@TRANCOUNT=0
पर)। फर्क सिर्फ इतना है मैं देख सकता हूँ इस स्निपेट है:, एक रोलबैक लेनदेन transaction_name के नाम का उपयोग बयान बाहरी लेन-देन नेस्टेड लेनदेन का एक सेट के किसी भी स्तर पर क्रियान्वित किया जाता है तो
नेस्टेड लेनदेन के सभी वापस लुढ़का रहे हैं। यदि लेनदेन_नाम पैरामीटर के बिना रोलबैक वर्क या रोलबैक ट्रांज़ेक्शन स्टेटमेंट को नेस्टेड लेनदेन के किसी भी स्तर पर निष्पादित किया जाता है, तो यह बाहरी लेनदेन सहित सभी नेस्टेड लेनदेन को वापस ले जाता है।
पढ़ने से, यह मुझे बताता है कि एक नामित लेनदेन (जो बाहरी लेनदेन का नाम होना चाहिए) वापस लेना, केवल घोंसला लेनदेन वापस लुढ़का जाएगा। यह नामित लेनदेन को वापस लाने के लिए कुछ अर्थ देगा। (सभी "एक्स पंक्ति (यों) प्रभावित" सामान हटाया)
NOTRAN
--------------------------------------------------
NO
NOTRAN_TRANCOUNT
----------------
0
OUTERTRAN
--------------------------------------------------
NO
OUTER
OUTERTRAN_TRANCOUNT
-------------------
1
INNERTRAN
--------------------------------------------------
NO
OUTER
INNER
INNERTRAN_TRANCOUNT
-------------------
2
AFTERROLLBACK
--------------------------------------------------
NO
AFTERROLLBACK_TRANCOUNT
-----------------------
0
नोट में
CREATE TABLE #TEMP (id varchar(50))
INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT
BEGIN TRAN OUTERTRAN
INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT
BEGIN TRAN INNERTRAN
INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT
ROLLBACK TRAN OUTERTRAN
IF @@TRANCOUNT > 0 ROLLBACK TRAN
SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT
DROP TABLE #TEMP
परिणाम है कि वहाँ उत्पादन जब मैं बदलने के लिए कोई फर्क नहीं: तो मैं एक परीक्षण की स्थापना
ROLLBACK TRAN OUTERTRAN
बस
ROLLBACK TRAN
को
तो ROLLBACK TRANSACTION named_transaction
का बिंदु क्या है?
रीमस, धन्यवाद। मैं अब आपका लिंक देख रहा हूं ... –
ठीक है, मैं देखता हूं कि आपने क्या किया है। हालांकि, मैं अभी भी अपने मूल बिंदु के रूप में उत्सुक हूँ। मुझे बचत बिंदु और उनके मूल्य मिलते हैं, लेकिन मैं अभी भी एक लेनदेन (बिंदु बचाने के लिए) नाम वापस रोलिंग पर उलझन में हूँ। एक महत्वपूर्ण नोट, जाहिर है कि आप एक आंतरिक लेनदेन को रोलबैक नहीं कर सकते हैं। उदाहरण के लिए, रोलबैक ट्रैन इनरट्रान का परिणाम एक त्रुटि में होता है, "INNERTRAN को वापस नहीं लाया जा सकता है। उस नाम का कोई लेनदेन या सहेजने वाला बिंदु नहीं मिला।" इस बिंदु (वापस नामित नेस्टेड लेनदेन को अस्वीकार करने के बारे में) ओपी में उल्लिखित दस्तावेज लिंक में है। –
'INNERTRAN को रोलबैक करने के लिए आपको सिंटैक्स' सेव ट्रांज़ेक्शन इनरट्रान 'का उपयोग करने की आवश्यकता है जो एक सच्चे सेव पॉइंट बनाता है (जैसा कि नामित लेनदेन के विपरीत)। नामित लेनदेन ज्यादातर वसूली परिदृश्यों के लिए होते हैं ('स्टॉप आउटरट्रान के साथ पुनर्स्थापित करें) –