2009-11-28 12 views
6

मैंने एमएसडीएन के माध्यम से ROLLBACK TRANSACTION और nesting transactions पर पढ़ा है। जबकि मुझे ROLLBACK TRANSACTION savepointname का बिंदु दिखाई देता है, मुझे ROLLBACK TRANSACTION transactionname समझ में नहीं आता है।"रोलबैक ट्रांज़ेक्शन name_transaction" का क्या मतलब है?

  1. यह केवल जब transactionname सबसे बाहरी लेन-देन है काम करता है
  2. 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 का बिंदु क्या है?

उत्तर

5

सहेजें अंक ठीक उसी प्रकार हैं जैसा नाम का तात्पर्य है: लॉग अनुक्रम में 'अंक सहेजें'। लॉग अनुक्रम हमेशा रैखिक है। यदि आप एक सेव पॉइंट पर रोलबैक करते हैं, तो आप रोलबैक सब कुछ आपके लेनदेन को आपके वर्तमान लॉग स्थिति और सेव पॉइंट के बीच किया गया था। अपने उदाहरण पर विचार करें:

LSN 1: BEGIN TRAN OUTERTRAN 
LSN 2: INSERT INTO ... 
LSN 3: BEGIN TRAN INNERTRAN 
LSN 4: INSERT INTO ... 
LSN 5: ROLLBACK TRAN OUTERTRAN 

लॉग अनुक्रम संख्या (LSN) 1 पर OUTERTRAN बचाने के बिंदु बन जाता है। पहला INSERT एलएसएन 2 बनाता है। फिर INNERTRAN एलएसएन 3 के साथ एक सेव पॉइंट बनाता है। दूसरा INSERT एक नया एलएसएन बनाता है, 4. रोलबैक आउटरट्रान 'एलएसएन 1 तक रोलबैक लॉग' के बराबर है। आप लॉग के भाग को 'छोड़' नहीं सकते हैं, इसलिए आपको एलएसएन 1 तक लॉग इन में प्रत्येक ऑपरेशन को रोलबैक करना होगा (जब सेव पॉइंट आउटरट्रान बनाया गया था) मारा जाता है।

दूसरी तरफ यदि अंतिम ऑपरेशन में आप रोलबैक इनरट्रान जारी करेंगे तो इंजन एलएसएन 3 तक वापस रोल करेगा (जहां 'इन्टरट्रान' सेव पॉइंट लॉग में डाला गया था) इस प्रकार एलएसएन 1 और एलएसएन 2 (यानी पहला आईएनएसईआरटी)।

बचत बिंदुओं के व्यावहारिक उदाहरण के लिए Exception handling and nested transactions देखें।

+0

रीमस, धन्यवाद। मैं अब आपका लिंक देख रहा हूं ... –

+0

ठीक है, मैं देखता हूं कि आपने क्या किया है। हालांकि, मैं अभी भी अपने मूल बिंदु के रूप में उत्सुक हूँ। मुझे बचत बिंदु और उनके मूल्य मिलते हैं, लेकिन मैं अभी भी एक लेनदेन (बिंदु बचाने के लिए) नाम वापस रोलिंग पर उलझन में हूँ। एक महत्वपूर्ण नोट, जाहिर है कि आप एक आंतरिक लेनदेन को रोलबैक नहीं कर सकते हैं। उदाहरण के लिए, रोलबैक ट्रैन इनरट्रान का परिणाम एक त्रुटि में होता है, "INNERTRAN को वापस नहीं लाया जा सकता है। उस नाम का कोई लेनदेन या सहेजने वाला बिंदु नहीं मिला।" इस बिंदु (वापस नामित नेस्टेड लेनदेन को अस्वीकार करने के बारे में) ओपी में उल्लिखित दस्तावेज लिंक में है। –

+3

'INNERTRAN को रोलबैक करने के लिए आपको सिंटैक्स' सेव ट्रांज़ेक्शन इनरट्रान 'का उपयोग करने की आवश्यकता है जो एक सच्चे सेव पॉइंट बनाता है (जैसा कि नामित लेनदेन के विपरीत)। नामित लेनदेन ज्यादातर वसूली परिदृश्यों के लिए होते हैं ('स्टॉप आउटरट्रान के साथ पुनर्स्थापित करें) –

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