2010-10-15 11 views
5

मुझे इस तरह की स्थिति है।डेटा को पढ़ने से रोकने के लिए उपयोग करने के लिए किस अलगाव स्तर का उपयोग किया जाता है?

क्वेरी इस तरह है।

Select * from TABLE where ID = 1 

(क्या एक प्रश्न :)

उसके बाद मुझे लगता है कि पंक्ति में सामान बदलने के लिए और नए आईडी के साथ डालें।

मैं अन्य प्रश्नों को क्वेरी से पहले मूल पंक्ति को पढ़ने के लिए रोकना चाहता हूं, जब तक कि मैं पढ़ और सम्मिलित नहीं करता। उसके बाद ... आगे बढ़ो।

असल में मैं लेनदेन में होने के लिए चुनना और डालना चाहता हूं, अलगाव स्तर के साथ जो केवल उस पंक्ति से पढ़ने को रोक देगा जब तक कि सम्मिलन समाप्त नहीं हो जाता है।

OleDbTransaction खेलने में है, क्योंकि मैं एसक्यूएल सर्वर 6.5 का उपयोग करें (अरे हाँ आप इसे सही पढ़ा है, मत पूछो क्यों :)

मैं के माध्यम से अलगाव के स्तर वर्णन खुदाई की गई थी लेकिन काफी उन्हें नहीं समझ सकता और समाधान खोजने के मेरी समस्या के लिए, तो मेरा प्रश्न यह है कि OleDbTransaction के लिए उपयोग करने के लिए अलगाव स्तर क्या है?

आशा है कि मैं स्पष्ट था :)

धन्यवाद।

उत्तर

-1

आपको पंक्ति पर ताला लगाने की आवश्यकता है: पंक्ति को पढ़ने से पहले लॉक बनाएं और पंक्ति को अपडेट करने के बाद लॉक को छोड़ दें।

में ओरेकल और इसी तरह के डेटाबेस, ताला नहीं है पढ़ता है, तो आप निम्न (लेन-देन में) क्या करने की जरूरत:

SELECT * FROM table WHERE id=? FOR UPDATE 
... 
UPDATE table .... 

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

मुझे लगता है, अपने प्रश्न में, आप अद्यतन पंक्ति के बाद आप इसे चुना है मतलब है, नहीं यह (डालने एक नई पंक्ति बनाता है, अद्यतन किसी मौजूदा पंक्ति को बदल देता है)

+0

बेकार जवाब, क्योंकि एमएस एसक्यूएल में मूल अलगाव स्तर तोड़ने वाला है तो ओरेकल – Andrey

+0

-1 में आप ओरेकल के लिए उत्तर क्यों देते हैं जब यह SQL सर्वर होता है, और फिर आप का उल्लेख नहीं करते हैं इसके बारे में भी जानते हो? – gbn

+0

सबसे पहले इंटरनेट पर कोई भी इस पृष्ठ पर आ सकता है और ओरेकल का उपयोग कर रहा है, इसलिए मैंने सोचा कि मैं इसे भी शामिल कर सकता हूं; दूसरी बात यह SQL सर्वर में समान हो सकती है, इसलिए यह सही दिशा में एक सूचक हो सकता है। –

0

वर्णित स्थिति डालने फैंटॉम रीड कहा जाता है। तो आपको Serializable अलगाव की आवश्यकता है (SERIALIZABLE)

+0

यह क्यों कम किया गया था? – Andrey

+0

सबसे पहले मैंने इस अलगाव स्तर को रखा, और फिर कुछ अन्य, लेकिन हर मामले में मुझे यह कहते हुए त्रुटि मिली कि ओहेर प्रक्रिया जो समान चयन क्वेरी निष्पादित करती है, डेडलॉक में पकड़ी जाती है, और डेडलॉक का शिकार हो जाती है और रद्द कर दिया जाता है। ऐसा लगता है कि अलगाव स्तर के साथ इस बात की तरह मेरा समाधान नहीं है या मैं कुछ गलत कर रहा हूं .. – 100r

5

आपको लॉक की अवधि लॉक रखना होगा। और विशेष रूप से भी।

अब, मुझे SQL Server 6.5 के लिए सही विकल्प सुनिश्चित नहीं हैं। के बाद से, एर, इसके साथ काम नहीं किया 199x

BEGIN TRAN 

--edit, changed to XLOCK, ROWLOCK, HOLDLOCK 
SELECT * from TABLE WITH (XLOCK, ROWLOCK, HOLDLOCK) where ID = 1 
... 
INSERT 

COMMIT 

संपादित करें:

मेरे परिवर्तन एकल पंक्ति विशेष रूप से (ठीक विस्तृत रूप से) लेन-देन के अंत तक लॉक करने के लिए करना है।

हालांकि, आईआईआरसी रोउलॉक को SQL सर्वर 7 और 6.5 के साथ जोड़ा गया था केवल पृष्ठ ताले थे। लेकिन यह कुछ समय हो गया है। मेरे पास बालों और दांत वापस थे :-)

+0

मुझे टेबल लॉक का उपयोग नहीं करना चाहिए। क्योंकि वहाँ कुछ वास्तविक भारी queris हर समय चल रहे हैं, और TABLOCKX टेबल लॉक सही है? – 100r

+0

कृपया अद्यतन – gbn

+0

tnx देखें। मैं ताले में से कोई भी काम नहीं कर सका। क्वेरी संकलित नहीं होगी। शायद 6.5 सिंटैक्स अलग है। मैं सोमवार को काम पर कोशिश करूंगा, भगवान का शुक्र है मेरे पास घर पर 6.5 नहीं है :) – 100r

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

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