लॉक बनाएं टेबल


19

एक अन्य अनुप्रयोग में मैं खराब डिजाइन से मारा गया था: कई धागे EnsureDatabaseSchemaExists()समवर्ती तरीके से एक विधि को निष्पादित करते हैं, जो मूल रूप से इस तरह दिखता है:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN

    CREATE TABLE MyTable ( ... );

END

हालाँकि, भले ही किसी SERIALIZABLE लेन-देन में निष्पादित किया गया हो, यह कोड थ्रेड-सुरक्षित नहीं लगता है (अर्थात समानांतर कोड कई बार तालिका बनाने की कोशिश करता है)। क्या SELECT-statement को लॉक करने के लिए बाध्य करने का कोई मौका है जो किसी अन्य थ्रेड को वही SELECT स्टेटमेंट करने से रोकता है?

क्या बहु-थ्रेडेड-एंसुरेस्केमिस्ट्स () विधियों के लिए एक बेहतर पैटर्न है?

जवाबों:


18

आप सबसे अच्छा शर्त एक स्पष्ट युक्त लेनदेन का उपयोग करते हैंSELECT और sp_getapplock का उपयोग करके पूरे ऑपरेशन ( CREATE TABLE) को बचाने के लिए एक कस्टम अनन्य लॉक प्राप्त करना है । सिस्टम ऑब्जेक्ट अलगाव स्तर के अनुरोधों का सम्मान नहीं करते हैं और डिजाइन द्वारा उपयोगकर्ता तालिकाओं के समान ही ताले का उपयोग करते हैं।

मूल कोड में दौड़ की स्थिति यह है कि कई धागे तालिका का निष्कर्ष निकाल सकते हैं इससे पहले कि कोई धागा CREATE TABLEबयान के रूप में दूर नहीं होता है ।


6
+1 बस सुनिश्चित करें कि applock सेलेक्ट चेक को लपेटता है । अन्यथा आप गतिरोध का परिचय देंगे। आदर्श रूप से किसी को एस मोड में ऐप लॉक मिलेगा, चेक करें, एक्स में अपग्रेड करें, लेकिन यह मुश्किल है (कम से कम कहने के लिए ...)। सबसे सुरक्षित विकल्प एक्स का अधिग्रहण करना है, फिर पूरे डीबी स्कीमा की तैनाती करें। यह एक दुर्लभ ऑप (उदाहरण के लिए ऐप स्टार्टअप पर) होना चाहिए ताकि एक्स लॉक को इससे ज्यादा फर्क न पड़े।
रेमस रुसानु

12

मेरी सिफारिश होगी कि मैं एक सर्वश्रेष्ठ प्रयास करने / पकड़ने की कोशिश करूं। डुप्लिकेट मामले को स्पष्ट रूप से संभालें, जैसे कि, उपयुक्त। अनदेखी करो इसे...

असली सवाल: डीडीएल कई एक्सएक्ट से ऑन-डिमांड क्यों चल रहा है? आम तौर पर अपग्रेड और माइग्रेशन एक गंभीर मामला है, समर्पित समय खिड़कियों में संभाला जाता है ... आप नहीं चाहते हैं कि आपका माइग्रेशन (कोड-फर्स्ट?) अनपेक्षित रूप से किक करने के लिए, उन अपडेट चरणों में से कुछ एक बड़ी मेज पर घंटे ले सकते हैं (आकार-आकार -डाटा संचालन ...)


3
कोड किसी प्रकार का डेटाबेसलॉगर है जो अपनी मांग पर तालिका बनाता है। कोई प्रवास नहीं, कोई मज़ेदार व्यवसाय नहीं। हालाँकि, आप पूरी तरह से सही हैं। मैं उचित तरीके से कोड को रिफलेक्टर करने जा रहा हूं।
DR

4
यह भी विचार करें कि ऊंचा विशेषाधिकार के संदर्भ (जैसे एक व्यवस्थापक द्वारा) पर चलाने के लिए तैनाती / सेटअप पूरी तरह से ठीक है, लेकिन सामान्य ऑप्स नहीं है। वर्तमान में आपको CREATE TABLEसामान्य ऑप्स के लिए अनुदान की आवश्यकता है ...
रेमुस रुसानु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.