सवाल "क्वेरी सम्मिलित करें" से पहले "लेनदेन शुरू करें" क्यों पूरी तालिका को ताला लगा देता है?


मैंने रिकॉर्ड डालने के लिए एक संग्रहित प्रक्रिया लिखी। मैंने क्वेरी सम्मिलित करने के ठीक ऊपर "लेनदेन शुरू करें" और क्वेरी निष्पादित की। मैंने देखा कि एक और एप्लीकेशन जो एक ही टेबल से रिकॉर्ड्स के साथ एक वेब पेज दिखा रहा था, सम्मिलित होने के समय तक फांसी दी गई थी।

लेनदेन शुरू क्यों करें पूरी तालिका ताले? लेखकों को पाठकों को अवरुद्ध नहीं करना चाहिए। यह डिफ़ॉल्ट रूप से चालू होना चाहिए।

मैं एसक्यूएल-सर्वर 2005 एक्सप्रेस का उपयोग कर रहा हूं। मैं यह भी जानना चाहता हूं कि ओरेकल और माईएसक्यूएल एक ही स्थिति को कैसे संभालते हैं।


6
2017-09-30 14:51


मूल


यह एक बेवकूफ सवाल हो सकता है, लेकिन क्या आप वास्तव में अंत में लेनदेन करते हैं? - mclark1129
@ माइकसी: मैं खुद ही एक ही चीज़ सोच रहा था। - MyItchyChin
@ माइकसी हाँ, मैं करता हूँ। - RPK


जवाब:


शुरूआत लेनदेन एक लेनदेन की शुरुआत है - जब तक आप अपने लेनदेन को समाप्त नहीं करते हैं, तब तक तालिका में कोई अन्य डेटा लिखा नहीं जा सकता है, यह डिज़ाइन द्वारा है, ताकि डेटाबेस पर एसीआईडी ​​मानदंडों को लागू किया जा सके। http://en.wikipedia.org/wiki/ACID

यदि आप एकाधिक प्रश्नों को निष्पादित करने की आवश्यकता है तो आप एक लेनदेन का उपयोग करते हैं जैसे कि वे एक ही परमाणु ऑपरेशन थे। यदि आपको परमाणु की आवश्यकता नहीं है, तो लेनदेन का उपयोग न करें!

हालांकि यह बहुत ही बुनियादी चीजें हैं - डेटाबेस कोड लिखने से पहले आपको बुनियादी डेटाबेस सिद्धांत पर ताज़ा करने की आवश्यकता हो सकती है, यदि आप लेन-देन जैसे मूल सिद्धांतों से परिचित नहीं हैं तो आप ऐप को गंभीर नुकसान पहुंचा सकते हैं।


5
2017-09-30 15:25



मैं निम्नलिखित नहीं हूं कि दूसरा उपयोगकर्ता एक चयन का उपयोग क्यों नहीं कर सकता है? - RPK
@ बार्ट: यह नहीं है हमेशा सच है, लेनदेन अलगाव स्तर बदला जा सकता है। - Massimo
no other data can be written to the table until you end your transaction  यह गलत है। एसक्यूएल सर्वर के पास बहुत ही लंबे, बहुत लंबे समय तक पृष्ठ-स्तर और पंक्ति-स्तर लॉकिंग है। - Brandon


यद्यपि दूसरों ने जो कहा है वह मूल रूप से सही है, यह व्यवहार आपके द्वारा उपयोग किए जा रहे लेनदेन अलगाव स्तर पर निर्भर करता है; यह है एक लेनदेन के लिए तकनीकी रूप से संभव है कि एक पूरी मेज को लॉक न करें।

यदि आप अन्य उपयोगकर्ताओं को अपने डेटा को पढ़ने में सक्षम होना चाहते हैं, जबकि आप अभी भी उन्हें संशोधित कर रहे हैं, तो आप टीआईएल को सेट कर सकते हैं READ UNCOMMITED:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED

बेशक, आपको होना चाहिए बहुत इस सेटिंग के साथ सावधान रहें, क्योंकि उस समय अन्य उपयोगकर्ता क्या कर रहे हैं, इस पर निर्भर करता है कि यह किसी भी प्रकार की डेटा विसंगतियों का कारण बन सकता है।

यहां अधिक जानकारी:

http://msdn.microsoft.com/en-us/library/ms189122.aspx
http://msdn.microsoft.com/en-us/library/ms173763.aspx


4
2017-09-30 17:39



दस्तावेज़ों को पढ़ना ऐसा लगता है कि न केवल लेनदेन के तहत अन्य लेनदेन डेटा को संशोधित कर सकते हैं बल्कि रिवर्स लेनदेन और अन्य लेनदेन दोनों द्वारा गंदे पढ़ने / लिखने की अनुमति भी सही है। कृपया मुझे बताएं कि मैं यह गलत पढ़ रहा हूं। "निर्दिष्ट करता है कि बयान उन पंक्तियों को पढ़ सकते हैं जिन्हें अन्य लेनदेन द्वारा संशोधित किया गया है लेकिन अभी तक प्रतिबद्ध नहीं है। पढ़ा गया अन्तर्निहित स्तर पर चल रहे लेनदेन मौजूदा लेनदेन द्वारा पढ़े गए डेटा को संशोधित करने से अन्य लेनदेन को रोकने के लिए साझा ताले जारी नहीं करते हैं।" - MyItchyChin
यदि आप पढ़ाई संयुक्त स्तर पर लेनदेन चला रहे हैं, तो अन्य उपयोगकर्ता भी कर सकते हैं पढ़ना वह डेटा जो आप अपडेट कर रहे हैं। वे नहीं कर सकते संशोधित उन्हें। - Massimo
मुझे विश्वास नहीं है read uncommitted ताले रखने से एक डालने / अद्यतन / हटाएगा। अलगाव स्तर रखे ताले के प्रकार (पंक्ति-स्तर, पंक्ति सीमा, पृष्ठ इत्यादि) को प्रभावित कर सकता है और यह किस प्रकार के ताले का सम्मान करेगा (क्या यह किसी और के साझा लॉक पर अवरुद्ध होगा या नहीं)। लेकिन मुझे विश्वास नहीं है कि मूलभूत 4 अलगाव स्तरों में से कोई भी लॉकिंग अपडेट से बच जाएगा। - Brandon
हालांकि, स्नैपशॉट अलगाव है, जिसका एक अन्य उत्तर उल्लेख किया गया है, जो एक और अलगाव स्तर की तरह दिखता है, लेकिन वास्तव में पाठकों और लेखकों को एक-दूसरे को अवरुद्ध करने का एक तरीका है। - Brandon


खैर, मैं एक एसक्यूएल सर्वर लड़का नहीं हूं, इसलिए, मैं उससे बात नहीं करूंगा।

लेकिन, चूंकि सवाल 'ओरेकल' टैग किया गया है और पोस्टर ने यह भी पूछा कि यह ओरेकल में कैसे काम करता है, मैं उस हिस्से को संबोधित करूंगा।

ओरेकल में, डिफ़ॉल्ट लेनदेन अलगाव स्तर को पढ़ा जाता है। आगे, ओरेकल हमेशा पंक्ति-स्तर पर ताले, और कभी भी लॉक को ब्लॉक नहीं करता है (जिसे SQL सर्वर में पृष्ठ कहा जाता है?) स्तर।

इसलिए, यदि आप किसी तालिका में पंक्ति 'ए' को लॉक करते हैं, और फिर कोई अन्य सत्र उसी तालिका में पंक्ति 'बी' को लॉक करने का प्रयास करता है, तो वह लॉक सफल हो जाएगा, यहाँ तक की यदि पंक्तियां एक ही ब्लॉक में हैं।

ओरेकल में, "लेनदेन शुरू करने" के रूप में, कोई भी डीएमएल पूरी तरह से लेनदेन शुरू कर देगा, अगर कोई पहले ही शुरू नहीं हुआ है। वह लेनदेन तब तक खुला रहेगा जब तक सत्र स्पष्ट रूप से काम नहीं करता है या वापस रोल करता है, या मार दिया जाता है (जिस स्थिति में ओरेकल लेनदेन को वापस लाएगा)।

हालांकि, ओरेकल के पास "लेनदेन शुरू करें" वाक्यविन्यास है, जो 'सेट लेनदेन' है। इसका उपयोग केवल पढ़ने या लिखने के लेनदेन को पढ़ने या अलगाव स्तर निर्धारित करने के लिए किया जा सकता है।

केवल पढ़ने के लेनदेन का एक दिलचस्प उपयोग यह है कि (केवल पढ़ने के अलावा), यह लेनदेन की शुरुआत के समय बिंदु के अनुरूपता को पढ़ने के लिए सभी लेनदेन को निष्पादित करता है। इसलिए, एक बार जब आप 'केवल लेनदेन को पढ़ते हैं' करते हैं, तो आपके द्वारा निष्पादित कोई भी क्वेरी लेनदेन की शुरुआत के समय के अनुरूप परिणाम लौटाएगी। (आम तौर पर, क्वेरी परिणाम क्वेरी निष्पादन की शुरुआत के समय बिंदु के साथ स्वयं-संगत होते हैं, लेकिन केवल पढ़ने के लेनदेन के साथ, लेनदेन में निष्पादित सभी प्रश्न लेनदेन की शुरुआत के अनुरूप होंगे।)


3
2017-11-06 22:21



आप ओरेकल के डिफ़ॉल्ट अलगाव स्तर का उल्लेख करते हैं - क्या यह सभी संस्करणों के लिए है? - Peter Schofield


लेखकों को पाठकों को अवरुद्ध नहीं करना चाहिए

यह केवल के लिए सच है स्नैपशॉट अलगाव, अन्य सभी अलगाव स्तरों के लिए पाठकों को ब्लॉक करने के लिए पाठकों को लिखने के लिए पाठकों और लेखकों को अवरुद्ध करने की आवश्यकता होती है (गंदे पढ़ने पर विचार नहीं किया जाता है, क्योंकि वे हैं असंगत और कभी भी इस्तेमाल नहीं किया जाना चाहिए)। यदि आपको इस व्यवहार की आवश्यकता है, तो पंक्ति संस्करण का उपयोग करें (लिंक में समाधान शामिल है)।

थोक सम्मिलन पूरी तालिका को क्यों लॉक करता है?

यह वास्तव में सच हो सकता है या नहीं भी हो सकता है। व्यवहार आपके नियंत्रण में है:

TABLOCK

निर्दिष्ट करता है कि एक टेबल-स्तरीय लॉक की अवधि के लिए अधिग्रहण किया जाता है   थोक आयात ऑपरेशन। एक टेबल को समवर्ती रूप से लोड किया जा सकता है   एकाधिक क्लाइंट यदि तालिका में कोई अनुक्रमणिका नहीं है और टैबलेट निर्दिष्ट है।   डिफ़ॉल्ट रूप से, लॉकिंग व्यवहार तालिका विकल्प द्वारा निर्धारित किया जाता है table lock on bulk load

अधिक जानकारी के लिए, उत्पाद विनिर्देशों को पढ़ें: थोक आयात के लिए लॉकिंग व्यवहार को नियंत्रित करना


1
2017-09-30 18:56