यूनिट ट्रांसपोर्टेशन स्तर के लाभ के लिए बेच दिया गया


12

मैं SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDअपने सामान्य एसक्यूएल प्रश्नों के बहुमत में उपयोग करता हूं, मुख्यतः क्योंकि यह मुझे मूल रूप से भाषा सीखने पर ड्रिल किया गया था।

मेरी समझ से, यह अलगाव स्तर उसी तरह से कार्य करता है, जैसा कि WITH (NO LOCK)मैं कभी भी उपयोग करने के लिए करता हूं SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

  • वहाँ कभी एक समय है कि मैं का उपयोग करना चाहिए है WITH (NO LOCK)से अधिक SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • क्या SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDअन्य उपयोगकर्ताओं को उन तालिकाओं से बाहर जाने से रोका जाता है जिन्हें मैं पढ़ रहा हूं?
  • यदि SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDताले को रोकने के लिए उपयोग किया जाता है, लेकिन मैं केवल डेटा पढ़ रहा हूं, तो इसका उपयोग करने में क्या मतलब है? क्या यह केवल सिस्टम गहन प्रश्न हैं जो ताले उत्पन्न करेंगे? 5-10 सेकंड में कहे जाने वाले प्रश्नों को चलाते समय क्या इसका उपयोग करना उचित है?
  • मुझे बताया गया है कि SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDअद्यतन डेटा का उपयोग जब अद्यतन में किया जाएगा, तो संभवतः गंदे डेटा से बचने के लिए उपयोग न करें। क्या यह एकमात्र कारण होगा?
  • जिस प्रकार के डेटाबेस पर मैं काम कर रहा हूं, उसके साथ उत्पादन और परीक्षण का माहौल है। हम शायद ही कभी उत्पादन के माहौल के बारे SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDमें सवाल कर रहे हों , लेकिन जब मुझे जरूरत होगी, मैं आमतौर पर अपनी क्वेरी में उपयोग करूंगा। मैं समझता हूं कि इसके साथ गंदे पढ़ना संभव है। डेटा प्राप्त करने के अलावा, जो डेटाबेस के लिए प्रतिबद्ध नहीं हो सकता है (और इसलिए मेरे परिणामों को बाहर फेंक सकता है) क्या अन्य प्रकार के 'गंदे पढ़े' संभव हो सकते हैं?

सामूहिक प्रश्नों के लिए क्षमा करें।


2
आप एक ही डेटा को दो बार पढ़ सकते हैं एक और गड्ढे में गिरना। मानक के रूप में RU या NO LOCK का उपयोग करना एक बुरा विचार है।
जेम्स एंडरसन

9
मैं का प्रयोग करेंगे नहीं READ UNCOMMITTEDहर जगह, ठीक उसी तरह से के रूप में मैं का उपयोग नहीं होगा में WITH (NOLOCK)हर जगह (वे अनिवार्य रूप से एक ही बात कर रहे हैं) blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
मार्क Sinkinson

1
SNAPSHOT अलगाव मॉडल में देखें। वे आरसीयू की तुलना में बहुत अधिक मजबूत हैं और ब्लॉक करने या अवरुद्ध करने का कारण नहीं हैं। वे आपके लिए एक अच्छे डिफ़ॉल्ट मॉडल की तरह ध्वनि करते हैं (RCU के लिए डिफ़ॉल्ट के बजाय!)।
usr

जवाबों:


26

यह भयानक है, कि आपने इसे इस तरह सीखा (क्षमा करें!)।

READ UNCOMMITTEDचलो आप हर पंक्ति पढ़ते हैं, हाँ। यहां तक कि जो वर्तमान में एक में किया जाता है INSERT, UPDATE, DELETEआपरेशन। यह बहुत उपयोगी है अगर आपको कुछ डेटा या मिशन क्रिटिकल SELECT-स्टेटमेंट्स पर एक त्वरित नज़र डालने की ज़रूरत है जहां एक ब्लॉक बहुत हानिकारक होगा।

वास्तव में, आप अपनी अखंडता को जोखिम में डालते हैं। यह हो सकता है कि आप एक पंक्ति पढ़ते हैं, जिसका उपयोग वर्तमान में नष्ट या परिवर्तन में किया जाता है। यह भी दिखाई दे सकता है कि आप एक गलत मान पढ़ते हैं। यह वास्तव में असामान्य हो सकता है, लेकिन ऐसा हो सकता है। मुझे इससे क्या मतलब है? ठीक है, एक पंक्ति के बारे में सोचें जो बहुत व्यापक है (इसमें कई कॉलम हैं जिनमें कई लंबी-कॉलम हैं nvarchar)। इस पंक्ति पर एक अपडेट होता है और नए मान सेट करता है। दुर्लभ मामलों में यह आपके साथ हो सकता है, कि आप केवल आधी पंक्ति पढ़ते हैं। उदाहरण के लिए एक और बात हो सकती है, यदि कोई उपयोगकर्ता अपने लॉगिन मूल्यों को बदलता है। वह अपना मेल + पासवर्ड बदलता है। मेल पहले से ही सेट है, लेकिन पासवर्ड नहीं है। इस तरह आपके पास एक असंगत स्थिति है।

मैं इसके बारे में भूलने का सुझाव दूंगा READ UNCOMMITTED। बस इसका उपयोग करें जहां इसकी वास्तव में आवश्यकता है।

READ_COMMITTED_SNAPSHOTडेटाबेस विकल्प को सक्षम करने के लिए आपके लिए एक और विकल्प हो सकता है - इसके बाद आप READ COMMITTED SNAPSHOTअपने टेम्पर्ड में सक्षम पंक्ति संस्करण के कारण उपयोग कर सकते हैं । इस तरह से आप सिर्फ एक पंक्ति का दूसरा (पुराना) संस्करण पढ़ते हैं। यह आपकी क्वेरी को ब्लॉक नहीं करेगा। लेकिन यह हो सकता है कि आप एक पुराना मूल्य भी पढ़ें, लेकिन एक पुराना मूल्य।

WITH(READPAST)इसके बजाय एक और विचार हो सकता है WITH(NOLOCK)। आप तालिका की पुरानी स्थिति (थोड़ा सा SNAPSHOT ISOLATION) में पढ़ेंगे , लेकिन आप इसके बजाय वर्तमान में लॉक की गई सभी पंक्तियों को छोड़ देंगे।


@ ध्वनि, प्रतिक्रिया के लिए बहुत बहुत धन्यवाद! मैं वास्तव में उस पर मदद की सराहना करता हूं।
dmoney

@ हिंगसाइट, ऐसा लगता है, लेकिन एक बहुत अच्छा मौका है कि यह मेरे बयान की व्याख्या थी, आपके इनपुट के लिए धन्यवाद।
dmoney

1
SNAPSHOT ISOLATIONचालू करने के लिए सक्षम होने की आवश्यकता नहीं है READ COMMITTED SNAPSHOT। केवल READ COMMITTED SNAPSHOTडेटाबेस विकल्प को सक्षम करने की आवश्यकता है ताकि गंदे रीड की आवश्यकता से बचने के लिए रीड संगति के लिए लॉक करने के बजाय पंक्ति संस्करणिंग हो।
डैन गुज़मैन

हां मेरा मतलब था कि @DanGuzman। क्षमा करें उत्तर उस बिंदु में थोड़ा अस्पष्ट था। मैंने इसे संपादित किया। :-)
आयन

READPAST के साथ आप उन रिकॉर्ड्स को छोड़ देंगे जो लॉक हैं, आपको पुराने मान नहीं मिलेंगे - इसलिए मेरे द्वारा लगाई गई एकमात्र जगह का इस्तेमाल किया जा सकता है
जेम्स ज़ेड

2

जैसा कि स्वीकार किए गए उत्तर में कहा गया है, गलत डेटा पढ़ने के जोखिम के रूप में READ UNCOMMITTED आइसोलेशन लेवल (जब वास्तव में जरूरत हो तो को छोड़कर) का उपयोग करने के बारे में भूल जाएं। लेकिन आपके प्रश्न में तीसरे बुलेट बिंदु का उत्तर देने के लिए दो स्थितियां हैं जो मुझे उपयोगी लगती हैं:

  1. SQL सर्वर SSIS पैकेज लिखते और परीक्षण करते समय, पैकेज के चरणों को लेनदेन में लपेटा जा सकता है। यदि आप SSIS डीबगर में चरण दर चरण इसे चलाकर किसी पैकेज का परीक्षण कर रहे हैं, तो आप टेबल पर लॉक होने के दौरान टेबल की जांच करना चाह सकते हैं। सेट ट्रांसकेशन अलगाव स्तर का उपयोग करने से असंबद्ध आपको पैकेज की डीबग करते समय तालिकाओं की जांच करने के लिए SQL सर्वर मैनेजर स्टूडियो का उपयोग करने की अनुमति देता है।

  2. SQL सर्वर मैनेजर स्टूडियो में आप परिवर्तनों को वापस करने का विकल्प देने के लिए लेनदेन में लपेटकर T-SQL कोड का परीक्षण करना चाह सकते हैं। उदाहरण के लिए एक परीक्षण डेटाबेस पर आप अपने परीक्षण के भाग के रूप में प्रारंभिक अवस्था में डेटा को पुनर्स्थापित करना चाह सकते हैं। यदि आप लेनदेन-लिपटे हुए कोड का परीक्षण कर रहे हैं और आप लेन-देन की जाँच कर रहे हैं, तो लेन-देन की जाँच चल रही है, आप किसी अन्य विंडो में मानों की जाँच करने के लिए SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED का उपयोग कर सकते हैं।

मैं स्वीकार करता हूं कि ये READ UNCOMMITTED के लिए काफी अस्पष्ट उपयोग हैं, लेकिन मैंने इन्हें एक परीक्षण वातावरण में उपयोगी पाया है।


1

अधिकांश डेटाबेस में, अधिकांश गतिविधि, यहां तक ​​कि आवेषण, डिलीट और अपडेट भी स्पष्ट लेनदेन से बाहर हैं।

ज़रूर, READ UNCOMMITTED(डर्टी रीड्स) इन मामलों में गलत जानकारी दे सकता है, लेकिन यह जानकारी 5 सेकंड पहले ही सही हो गई थी।

जिस समय डर्टी रीड्स वास्तव में बुरे परिणाम उत्पन्न करते हैं, जब एक लेन-देन विफल हो जाता है और वापस रोल करना पड़ता है या दो तालिकाओं के खिलाफ क्वेरी चलाते समय जो सामान्य रूप से एक स्पष्ट लेनदेन का उपयोग करके एक साथ अपडेट किए जाते हैं।

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

इसके बजाय, गंदे रीड्स का उपयोग करना सिस्टम को बहुत तेज और अधिक विश्वसनीय बनाता है (भाग में बेहतर प्रदर्शन के कारण असंगतियां होने की संभावना कम होती है)।

निश्चित रूप से, ऐसे समय होते हैं जब उनका उपयोग नहीं किया जाना चाहिए। मैं डेटाबेस को READ UNCOMMITTEDअलग-थलग स्तर का उपयोग करने के लिए डिफ़ॉल्ट रूप से सेट करना पसंद करता हूं या यहां तक ​​कि SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDएसक्यूएल लिपियों और एसपी की शुरुआत में स्पष्ट कथन का उपयोग करके - बहुत अधिक संभावना है कि एक डर्टी रीड तब ​​होगा जब यह नहीं होना चाहिए। इसके बजाय, (NOLOCK)संकेत एक बेहतर दृष्टिकोण हैं क्योंकि वे स्पष्ट रूप से इंगित करते हैं कि प्रोग्रामर ने सोचा कि वे क्या कर रहे थे और उन्होंने फैसला किया कि, इस विशिष्ट क्वेरी में विशिष्ट तालिका के लिए, डर्टी रीड्स सुरक्षित थे।

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

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