मैं उम्मीद कर रहा हूं कि कोई व्यक्ति इस व्यवहार पर कुछ प्रकाश डाल सकता है कि मैं 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 द्वारा आयोजित होने का सबसे खराब मामला होगा और फिर नई सामग्री वापस करेगा तालिका। क्या आप मदद कर सकते हैं?