पारगमन अलगाव की सीमा बनाम TRUNCATE?


10

मैं उम्मीद कर रहा हूं कि कोई व्यक्ति इस व्यवहार पर कुछ प्रकाश डाल सकता है कि मैं SNAPSHOT अलगाव बनाम TRUNCATE के बारे में उम्मीद नहीं कर रहा था।

डेटाबेस: स्नैपशॉट अलगाव की अनुमति दें = सच; क्या कमिटेड स्नैपशॉट पढ़ें = गलत।

प्रक्रिया 1 (लंबे समय से चल रहे कॉम्प्लेक्स से टेबल जू की सामग्री को प्रतिस्थापित करता है जिसमें बहुत सारे जोड़ होते हैं):

BEGIN TRAN; 
TRUNCATE TABLE foo; 
INSERT INTO foo SELECT...; 
COMMIT;

प्रक्रिया 2 (तालिका फू से पढ़ता है):

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 
SELECT * FROM foo;

यदि Procedure1 चल रहा है, जबकि Procedure2 निष्पादित हो रहा है, तो Procedure1 समाप्त होने तक Procedure2 को LCK_M_SCH_S प्रतीक्षा (sp_WhoIsActive के अनुसार) के साथ आयोजित किया जाता है। और जब प्रक्रिया 2 पूरी हो जाती है, तो यह इस अपवाद को बढ़ा देता है:

स्नैपशॉट अलगाव लेन-देन डेटाबेस 'डेटाबेसनाम' में विफल रहा क्योंकि इस लेनदेन की शुरुआत के बाद से एक और समवर्ती लेनदेन में डीडीएल बयान द्वारा बयान द्वारा एक्सेस की गई वस्तु को संशोधित किया गया है। इसकी अनुमति नहीं है क्योंकि मेटाडाटा का पाठांतर नहीं किया गया है। मेटाडेटा के लिए एक समवर्ती अद्यतन स्नैपशॉट अलगाव के साथ मिश्रित होने पर असंगति पैदा कर सकता है।

हालाँकि, Microsoft TRAPCATE को SNAPSHOT अलगाव के तहत DDL कथन की अनुमति नहीं देता है: http://msdn.microsoft.com/en-us/library/bb933783.aspx

स्पष्ट रूप से मुझे कुछ ठीक से समझ में नहीं आ रहा है, क्योंकि मुझे उम्मीद है कि प्रक्रिया 2 का सबसे अच्छा मामला तुरंत TRUNCATE से पहले तालिका से सबसे हाल ही में किए गए डेटा को वापस कर देगा या प्रक्रिया 1 द्वारा आयोजित होने का सबसे खराब मामला होगा और फिर नई सामग्री वापस करेगा तालिका। क्या आप मदद कर सकते हैं?


क्या आप इसके बजाय DELETE FROM foo का उपयोग कर सकते हैं? वह स्कीमा लॉक नहीं लगाएगा।
सकलैक

DELETE FROM वास्तव में जिस तरह से मैं इस के आसपास काम कर रहा हूं। मुझे इस बात में भी दिलचस्पी है कि मुझे त्रुटि क्यों हो रही है (और केवल प्रक्रिया 1 रिटर्न के बाद)।
मार्क फ्रीमैन

जवाबों:


19

'DDL'सूचीबद्ध कार्यों की सूची व्यापक नहीं है (और TRUNCATE TABLEउस सूची से केवल चूक नहीं है)। चाहे TRUNCATE TABLEहै DMLया DDLबहस के दोनों पक्षों पर प्रेरक उदाहरण के साथ, एसक्यूएल सर्वर में एक भरा सवाल है, और पुस्तकें ऑनलाइन में दोनों तरीकों से प्रविष्टियां।

स्नैपशॉट अलगाव लेनदेन के दृष्टिकोण से, ट्रंकट में ताला लेनेSch-M की आवश्यक गुणवत्ता होती है , जो अवरोध को समझाती है (क्योंकि RCSIऔर SIअभी भी Sch-Sताले प्राप्त करते हैं ); और यह आंतरिक मेटाडेटा संस्करण (आंतरिक कारणों के लिए *) को टक्कर देता है जिसके परिणामस्वरूप त्रुटि 3961 है।

इसलिए, जो व्यवहार आप देख रहे हैं वह अपेक्षित है, बस बहुत अच्छी तरह से प्रलेखित नहीं है।

* TRUNCATE टेबल का वर्तमान कार्यान्वयन पंक्ति संस्करण उत्पन्न नहीं करता है। मेटाडेटा संस्करण को टक्कर देना सही व्यवहार सुनिश्चित करने का सबसे सरल तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.