2016-02-29 10 views
5

में एक सौदे के भीतर SELECT कथन के लिए रखा गया है मुझे विश्वास है कि एसक्यूएल सर्वर में प्रत्येक SELECT बयान का कारण होगा या तो एक साझा या कुंजी ताला रखा जाना। लेकिन क्या यह एक ही प्रकार के लॉक को लेनदेन में रखेगा? क्या साझा या कुंजी ताले अन्य प्रक्रियाओं को एक ही रिकॉर्ड पढ़ने की अनुमति देंगे?ताला किस तरह एसक्यूएल सर्वर

उदाहरण के लिए मैं निम्नलिखित तर्क

Begin Trans 
-- select data that is needed for the next 2 statements 
SELECT * FROM table1 where id = 1000; -- Assuming this returns 10, 20, 30 

insert data that was read from the first query 
INSERT INTO table2 (a,b,c) VALUES(10, 20, 30); 

-- update table 3 with data found in the first query 
UPDATE table3 
SET d = 10, 
    e = 20, 
    f = 30; 

COMMIT; 

इस बिंदु पर मेरी चुनिंदा बयान अभी भी एक साझा या कुंजी लॉक पैदा करेगा या यह विशेष लॉक के पास भेजा जाएगा है? क्या अन्य लेन-देन तालिका 1 से रिकॉर्ड पढ़ने में सक्षम होंगे या क्या सभी लेन-देन तब तक इंतजार करेंगे जब तक कि मेरे लेन-देन किए जाने से पहले दूसरों का चयन करने में सक्षम न हो?

एक आवेदन में के बाद से एक सौदे के बाहर बयान का चयन करें स्थानांतरित करने के लिए और सिर्फ एक सौदे में सम्मिलित/अपडेट रखने बनाता है?

उत्तर

7

एक SELECT हमेशा एक साझा ताला स्थापित करेंगे - जब तक आप WITH (NOLOCK) संकेत का उपयोग करें (तो कोई ताला रखा जाएगा), एक READ UNCOMMITTED लेनदेन अलगाव स्तर (एक ही बात), का उपयोग करें या जब तक आप विशेष रूप से क्वेरी संकेत के साथ ओवरराइड जैसे WITH (XLOCK) या WITH (UPDLOCK)

एक लॉक अन्य पढ़ने की प्रक्रिया भी एक साझा ताला प्राप्त करने और डेटा को पढ़ने के लिए अनुमति देता साझा - लेकिन वे विशेष ताले अधिग्रहण किया जा रहा से (डालने, हटाने, अद्यतन के संचालन के लिए) को रोकने के।

इस मामले में, केवल तीन पंक्तियों के चयन के साथ, लॉक एस्केलेशन (केवल तब होता है जब एक ही लेनदेन द्वारा 5000 से अधिक ताले हासिल किए जा रहे हैं)।

लेनदेन अलगाव स्तर पर निर्भर करता है, उन साझा ताले अलग-अलग समय के लिए आयोजित किए जाएंगे। READ COMMITTED, डिफ़ॉल्ट स्तर के साथ, ताले, तुरंत जारी किया गया है के बाद डेटा को पढ़ने की गई है REPEATABLE READ या SERIALIZABLE के स्तर के साथ, जब तक लेन-देन के लिए प्रतिबद्ध या वापस लुढ़का हुआ है ताले आयोजित किया जाएगा, जबकि।

+0

इस मूल्यवान जानकारी के लिए आपको बहुत बहुत धन्यवाद। इसलिए यदि SQL सर्वर किसी भी चयन कथन के लिए डिफ़ॉल्ट रूप से 'प्रतिबद्ध पढ़ें' का उपयोग करता है। वहाँ लेनदेन –

+0

@MikeA बाहर मेरी चयन प्रश्नों को अलग करने का प्रयास करने के बाद से नहीं है: नहीं, कोई फर्क नहीं करता है - साझा ताले वास्तव में * पढ़ने * डेटा (बस से किसी अन्य प्रक्रिया को रोकने के लिए के लिए बस बहुत संक्षेप में हासिल कर ली हो जाएगा हमेशा करते पढ़ें कमिट चयन नहीं ताला: उन्हें बदलते समय आप उन्हें पढ़ रहे हैं), और उसके बाद वे फिर से जारी किया जाएगा - - अंदर या कि लेनदेन के बाहर एक ही प्रक्रिया –

+0

मामले में आप इस बारे में पता नहीं कर रहे हैं। तालाब केवल उन्हीं परिवर्तनों वाले पृष्ठों पर लिया जाता है। आप आरसी के तहत एक टेबल पढ़ सकते हैं जो एक्सलॉक किया गया है, एक अन्य लेनदेन द्वारा टैबलेट किया गया है। (मैंने कोशिश की।) – usr

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