2010-06-21 5 views
7

एसक्यूएल लेनदेन का उपयोग सम्मिलित करने, अद्यतन करने के लिए किया जाता है, लेकिन इसका उपयोग रिकॉर्ड पढ़ने के लिए किया जाना चाहिए?क्या मुझे रिकॉर्ड पढ़ने के दौरान एसक्यूएल लेनदेन का उपयोग करना चाहिए?

+0

सभी उत्तर देने वालों का धन्यवाद, मेरी इच्छा है कि सभी को उत्तर के रूप में चिह्नित करने का विकल्प था लेकिन वहां नहीं है। उदाहरण देने के लिए धन्यवाद, लॉकिंग के स्पष्टीकरण के लिए एक लिंक देने के लिए, मिलीसेकंड में डेटा को अद्यतित करने के तरीके के स्पष्टीकरण के लिए धन्यवाद। – user287745

उत्तर

8

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

केवल पढ़ने की प्रक्रिया में आपको केवल लेनदेन की आवश्यकता होगी (और, अक्सर, एक विशिष्ट लॉकिंग संकेत):
- आप "टुकड़ा-भोजन" रिकॉर्ड पढ़ते हैं और मूल्यों को बदलने के लिए और कुछ नहीं चाहिए जबकि आप हालांकि फिर से शुरू करते हैं। [जैसे कि एडीओ में एक कनेक्टेड रिकॉर्डसेट जिसे आप कर्सर के माध्यम से कर्सर करते हैं।]
- आप कुछ डेटा पढ़ते हैं, कुछ गणना करते हैं, फिर कुछ संबंधित डेटा पढ़ते हैं, लेकिन धारणा पर औसत समय में कुछ भी नहीं बदला जाता है।


संक्षेप में, आप लेन-देन की जरूरत है जब आप चाहते हैं अन्य प्रक्रियाओं SQL कथन के बीच अपने डेटा के साथ हस्तक्षेप करने से रोक दिया जाए।

3

शुद्ध पढ़ने के लिए लेनदेन रैपिंग की आवश्यकता नहीं है।

अपने SQL कथन के भीतर, लॉक संकेतों को आपके लिए उचित डेटा लौटने पर ध्यान रखना चाहिए (http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx)।

सर्वर स्तर पर, आप लेनदेन अलगाव स्तर (http://msdn.microsoft.com/en-us/library/ms173763.aspx) सेट कर सकते हैं।

संपादित

शुद्ध समझाते हुए पढ़ता

सभी अपने एसक्यूएल बयान तो आप आप परिणाम को पढ़ रहे हैं एक सौदे

SELECT Col1, Col2 
From Table1 
    INNER JOIN Table2 
     ON Table1.Id = Table2.Table1Id 

में रैप करने के लिए की जरूरत नहीं है पढ़ता है इस प्रकार की है, तो जो समानांतर में अन्य लेनदेन से प्रभावित हो सकता है तो आपको लेनदेन में लपेटना होगा। उदाहरण के लिए:

BEGIN TRANSACTION 

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21) 
UPDATE AccountSummary SET Balance = Balance + 43.21 

SELECT @Balance = Balance FROM AccountSummary 

COMMIT TRANSACTION 

वास्तव में, आप केवल शेष राशि वापस कर रहे हैं, लेकिन पूरे मौद्रिक लेनदेन को दो स्थानों पर काम करना है।

+0

निम्नलिखित उदाहरण में, कोई समवर्ती प्रक्रिया आपके द्वारा पढ़ी जा रही तालिकाओं में हस्तक्षेप कर सकती है। डेटा का कोई लेखन नहीं है, लेकिन संबंधित पढ़ने के बीच गणनाएं हैं। इस तरह के एक ट्रांज़ेक्शन को डेटा की स्थिति की रक्षा करने की आवश्यकता होगी। @temp चुनें में प्रवेश करें; ; चुनें; – MatBailie

+0

हालांकि यह एक शुद्ध पठन नहीं है। राज ने कहा "शुद्ध पढ़ने के लिए लेनदेन लपेटना जरूरी नहीं है।" –

+0

"शुद्ध पढ़ने" को परिभाषित करें, मैंने जो उदाहरण दिया है वह एक चर के अलावा किसी अन्य चीज़ के लिए कोई आवेषण, अद्यतन या हटा देता है। [यह एक आईएनटी, एक टेबल वैरिएबल, या कुछ अन्य डेटा कंटेनर हो सकता है ताकि गणना को सुविधाजनक बनाया जा सके जो अंतिम पढ़ने के व्यवहार को परिभाषित करेगा] – MatBailie

2

यदि आपको मिलीसेकंद जानकारी के लिए सबसे अद्यतित होने की आवश्यकता है तो आप TransactionOptions के साथ के IsolationLevel के साथ बनाए गए लेनदेन का उपयोग कर सकते हैं।

यह प्रदर्शन को प्रभावित करेगा क्योंकि यह तालिका (या तालिका के हिस्सों) को लॉक करेगा, इसलिए आपको यह पता लगाने की आवश्यकता है कि आपको वास्तव में इसकी आवश्यकता है या नहीं।

अधिकांश उपयोगों के लिए, यदि आप पढ़ रहे हैं, तो आपको इसके आसपास एक लेनदेन लपेटने की आवश्यकता नहीं है (मान लीजिए कि आप केवल एक ऑपरेशन में पढ़ रहे हैं)।

यह वास्तव में आपके आवेदन पर निर्भर करता है, इसके लिए आवश्यक डेटा और इसका उपयोग कैसे किया जाता है।

उदाहरण के लिए, यदि आप पढ़ते हैं और परिणामों के आधार पर आप लिखते हैं या अपडेट करते हैं, लेकिन यह महत्वपूर्ण है कि जो डेटा आपने अभी पढ़ा है वह वर्तमान है, आपको शायद पूरे तर्क को एक ही लेनदेन में लपेटना चाहिए।

1

नहीं, डेटा पढ़ने के लिए आम तौर पर लेनदेन की आवश्यकता नहीं होती है और यह आपके डेटा को भी धीमा कर देगा।

मैं आपको एटीओएमआईसी शब्द पर पढ़ने का सुझाव दूंगा। इससे आपको यह समझने में मदद मिलेगी कि किस लेनदेन के लिए हैं।

1

लेनदेन करना संभव है लेकिन इसका उद्देश्य क्या है?

आप सेट ट्रांसलेशन इशोलेशन लेवल स्टेटमेंट का उपयोग कर पूरे SQL सर्वर सत्र के लिए उपयुक्त अलगाव स्तर सेट कर सकते हैं।

SET TRANSACTION ISOLATION LEVEL 
    { 
     READ COMMITTED 
     | READ UNCOMMITTED 
     | REPEATABLE READ 
     | SERIALIZABLE 
    } 

Locking in Microsoft SQL Server:

यह एसक्यूएल सर्वर पुस्तकें ऑनलाइन से वाक्य रचना है।

0

जब आप किसी लेन-देन में कुछ संशोधित करते हैं, तो आप यह देखने के लिए पढ़ा गया कथन का उपयोग कर सकते हैं कि ऑपरेशन प्रभावी होने से ठीक पहले क्या होता है।

0

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

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

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