2011-09-13 7 views
38

मैं Entity Framework का उपयोग कर रहा हूं, और मैं अपने डेटाबेस में रिकॉर्ड डाल रहा हूं जिसमें ब्लॉब फ़ील्ड शामिल है। ब्लॉब फ़ील्ड डेटा के 5   एमबी तक हो सकता है।SQL सर्वर में डेटा डालने से पूरी तालिका लॉक हो जाती है?

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

तो यदि आप तालिका से किसी भी डेटा से पूछताछ कर रहे हैं, तो क्या यह सम्मिलित होने तक अवरुद्ध होगा (मुझे पता है कि इसके आसपास के तरीके हैं, लेकिन मैं डिफ़ॉल्ट रूप से बात कर रहा हूं)?

डेडलॉक का कारण बनने से पहले कितना समय लगेगा? क्या वह समय इस बात पर निर्भर करेगा कि सर्वर पर कितना भार है, उदा। अगर ज्यादा भार नहीं है, तो क्या डेडलॉक का कारण बन जाएगा?

क्या किसी विशेष समय पर लॉक होने पर निगरानी करने और देखने का कोई तरीका है?

यदि प्रत्येक धागा एकल तालिकाओं पर प्रश्न कर रहा है, तो क्या कोई ऐसा मामला है जहां अवरोध हो सकता है? तो क्या यह मामला नहीं है कि एक डेडलॉक केवल तभी हो सकता है जब आपके पास कोई प्रश्न हो जो इसमें शामिल हो और कई तालिकाओं पर कार्य कर रहा हो?

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

उत्तर

97

पवित्र गाय, आपको यहां बहुत सारे प्रश्न हैं, हे।यहां कुछ जवाब दिए गए हैं:

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

डिफ़ॉल्ट रूप से नहीं, लेकिन यदि आप टैबलेट संकेत का उपयोग करते हैं या यदि आप कुछ प्रकार के थोक लोड संचालन कर रहे हैं, तो हाँ।

तो यदि आप तालिका से किसी भी डेटा से पूछताछ कर रहे हैं तो यह सम्मिलित होने तक अवरुद्ध होगा (मुझे पता है कि इसके आसपास के तरीके हैं, लेकिन मैं डिफ़ॉल्ट रूप से बात कर रहा हूं)?

यह एक छोटा सा ट्रिकियर हो जाता है। अगर कोई उस तालिका में किसी पृष्ठ से डेटा चुनने का प्रयास कर रहा है जिसे आपने लॉक किया है, तो हाँ, आप 'em को अवरुद्ध कर देंगे। आप उस चयन कार्य पर नोलोक संकेत जैसे चीजों के साथ या पढ़ा गया स्नैपशॉट अलगाव का उपयोग करके उस पर काम कर सकते हैं। अलगाव स्तर कैसे काम करते हैं, इस पर एक शुरुआती बिंदु के लिए, Kendra Little's isolation levels poster देखें।

डेडलॉक का कारण बनने से पहले कितना समय लगेगा? क्या वह समय इस बात पर निर्भर करेगा कि सर्वर पर कितना भार है, उदा। अगर ज्यादा भार नहीं है तो इसमें डेडलॉक का कारण बन जाएगा?

डेडलॉक्स समय पर आधारित नहीं हैं - वे निर्भरताओं पर आधारित हैं। , वह सामान वह प्रश्न बी

  • क्वेरी बी द्वारा बंद है भी ताले का एक समूह कर रहा है की जरूरत है,

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

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

    क्या किसी विशेष समय पर लॉक होने पर निगरानी करने और देखने का कोई तरीका है?

    बिल्कुल - डायनेमिक मैनेजमेंट व्यूज़ (डीएमवी) है जो आप sys.dm_tran_locks की तरह पूछ सकते हैं, लेकिन सबसे आसान तरीका Adam Machanic's free sp_WhoIsActive stored proc का उपयोग करना है। यह sp_who के लिए एक बहुत चालाक प्रतिस्थापन है कि आप इस तरह फोन कर सकते हैं: प्रत्येक प्रश्न के लिए चल रहा है

    sp_WhoIsActive @get_locks = 1 
    

    , तो आप एक छोटे से एक्सएमएल कि ताले यह धारण का वर्णन मिलता है। एक अवरुद्ध कॉलम भी है, ताकि आप देख सकें कि कौन अवरुद्ध कर रहा है। होने वाले ताले की व्याख्या करने के लिए, आप Books Online descriptions of lock types जांचना चाहेंगे।

    यदि प्रत्येक धागा एकल तालिकाओं पर प्रश्न पूछ रहा है, तो क्या कोई ऐसा मामला है जहां अवरोध हो सकता है? तो क्या यह मामला नहीं है कि एक डेडलॉक केवल तभी हो सकता है जब आपके पास कोई प्रश्न हो जो इसमें शामिल हो और कई तालिकाओं पर कार्य कर रहा हो?

    मानें या नहीं, a single query can actually deadlock itself, और हाँ, प्रश्न केवल एक तालिका पर डेडलॉक कर सकते हैं। डेडलॉक्स के बारे में और भी जानने के लिए, The Difficulty with Deadlocks by Jeremiah Peschka देखें।

  • +3

    बहुत बढ़िया पठन सूची; धन्यवाद! – dividius

    +0

    अच्छा फॉर्म मेरे अच्छे आदमी .... – dotnetnewb

    0

    सबसे अच्छा जवाब मैं साथ आ सकता हूं: यह निर्भर करता है।

    जांचने का सबसे अच्छा तरीका है कि आपका कनेक्शन SPID ढूंढें और SP_lock SPID का उपयोग यह जांचने के लिए करें कि लॉक मोड टैब प्रकार पर एक्स है या नहीं। आप तालिका नाम को SELECT OBJECT_NAME(objid) से भी सत्यापित कर सकते हैं। मैं लॉकिंग की जांच के लिए नीचे दी गई क्वेरी का भी उपयोग करना चाहता हूं।

    SELECT RESOURCE_TYPE,RESOURCE_SUBTYPE,DB_NAME(RESOURCE_DATABASE_ID) AS 'DATABASE',resource_database_id DBID, 
        RESOURCE_DESCRIPTION,RESOURCE_ASSOCIATED_ENTITY_ID,REQUEST_MODE,REQUEST_SESSION_ID, 
        CASE WHEN RESOURCE_TYPE = 'OBJECT' THEN OBJECT_NAME(RESOURCE_ASSOCIATED_ENTITY_ID,RESOURCE_DATABASE_ID) ELSE '' END OBJETO 
        FROM SYS.DM_TRAN_LOCKS (NOLOCK) 
        WHERE REQUEST_SESSION_ID = --SPID here 
    

    एसक्यूएल सर्वर 2008 (और बाद में) में आप मेज पर ताला वृद्धि अक्षम करने और अपने डालने खंड प्रभावी रूप से एक चप्पू-आंकड़ा मजबूर कर में एक साथ (चप्पू-आंकड़ा) लागू कर सकते हैं। यह SQL सर्वर 2008 से पहले नहीं किया जा सकता है (आप ROWLOCK के साथ लिख सकते हैं, लेकिन SQL सर्वर इसे अनदेखा करना चुन सकता है)।

    मैं यहां जेनेरल्स बोल रहा हूं, और मुझे बीएलओबी के साथ ज्यादा अनुभव नहीं है क्योंकि मैं आमतौर पर डेवलपर्स को उनसे बचने की सलाह देता हूं, खासकर यदिएमबी से बड़ा है।

    INSERT INTO MyTable(Id, BigColumn) WITH (ROWLOCK) 
    VALUES(...) 
    

    इन दो सवालों के जवाब उपयोगी हो सकता है:

    3

    आप एसक्यूएल पर सीधा नियंत्रण है, तो आप का उपयोग कर पंक्ति स्तर लॉकिंग मजबूर कर सकते हैं

    Is it possible to force row level locking in SQL Server?

    Locking a table with a select in Entity Framework

    करने के लिए प्रबंधन स्टूडियो में मौजूदा आयोजित ताले देखें, सर्वर के नीचे देखें, फिर प्रबंधन/गतिविधि मॉनिटर के तहत। इसमें ऑब्जेक्ट द्वारा ताले के लिए एक अनुभाग है, इसलिए आपको यह देखने में सक्षम होना चाहिए कि आवेषण वास्तव में समस्या का कारण बन रहे हैं या नहीं।

    +0

    ध्यान दें, जैसा कि मैंने समझाया है, तालिका पर लॉक एस्केलेशन को अक्षम किए बिना, SQL सर्वर आपके संकेत को अनदेखा कर सकता है और कई कारकों के आधार पर लॉक को बढ़ा सकता है। –

    +0

    मुझे पूर्व-2008 व्यवहार के बारे में उस बिंदु को नहीं पता था - जब मैंने अपना प्रस्तुत किया था तो मैंने आपकी पोस्ट नहीं देखी थी। यदि संभव हो तो बड़े ब्लब्स से बचने के बारे में मैं इस बिंदु से सहमत हूं। –

    0

    डेडलॉक त्रुटियां आम तौर पर काफी जल्दी लौटती हैं। लॉक की प्रतीक्षा करते समय होने वाली टाइमआउट त्रुटि के परिणामस्वरूप डेडलॉक राज्य नहीं होते हैं। लॉक अनुरोधों में चक्र की तलाश करके SQL सर्वर द्वारा डेडलॉक का पता लगाया गया है।

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