2009-03-06 18 views
5

मुझे एएसपीनेट एप्लिकेशन में "निराशावादी लॉकिंग" जैसे कुछ को लागू करने के साथ अनुभवी किसी से कुछ सलाह चाहिए। यह व्यवहार मैं तलाश कर रहा हूँ है:मैं एएसपीनेट एप्लिकेशन में "निराशावादी लॉकिंग" कैसे कार्यान्वित करूं?

  1. उपयोगकर्ता एक आदेश # 313 को खोलने के लिए 313
  2. उपयोगकर्ता B प्रयास खोलता आदेश # लेकिन बताया जाता है कि उपयोगकर्ता एक आदेश एक्स मिनट के लिए विशेष रूप से खोला पड़ा है।

जब से मैं पहले इस कार्यक्षमता लागू नहीं किया है, मैं कुछ डिजाइन प्रश्न हैं:

  • क्या डेटा मैं आदेश रिकॉर्ड करने के लिए संलग्न करना चाहिए? मैं विचार कर रहा हूँ:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

मैं एक रिकॉर्ड करता है, तो LockRefreshedTime < अनलॉक हो गया है पर विचार करेंगे (अब - 10 मिनट)।

  • मैं कैसे गारंटी देते हैं कि ताले आवश्यक से अधिक समय के लिए आयोजित नहीं कर रहे लेकिन या तो अप्रत्याशित रूप से समय सीमा समाप्त नहीं करते हैं?

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

उत्तर

8

ऐसा लगता है जैसे आप वहां से अधिकतर हैं। मुझे नहीं लगता कि आपको वास्तव में LockRefreshedTime की आवश्यकता है, हालांकि यह वास्तव में कुछ भी नहीं जोड़ता है। लॉक एक्वायरटाइम का उपयोग यह तय करने के लिए भी हो सकता है कि लॉक कब बेकार हो गया है।

दूसरी चीज जो आप करना चाहते हैं, यह सुनिश्चित कर लें कि आप लेनदेन का उपयोग करें। आपको डेटाबेस लेनदेन के भीतर लॉक की जांच और सेटिंग को लपेटने की आवश्यकता है, ताकि आप दो उपयोगकर्ताओं के साथ समाप्त न हों जो सोचते हैं कि उनके पास वैध लॉक है।

यदि आपके पास ऐसे कार्य हैं जिनके लिए एक से अधिक संसाधनों (यानी किसी दिए गए प्रकार के एक से अधिक रिकॉर्ड या एक से अधिक प्रकार के रिकॉर्ड) पर ताले प्राप्त करने की आवश्यकता होती है तो आपको ताले को उसी क्रम में लागू करने की आवश्यकता होती है जहां आप करते हैं ताला। अन्यथा आपके पास एक मृत लॉक हो सकता है, जहां कोड के एक बिट में रिकॉर्ड लॉक होता है और रिकॉर्ड बी लॉक करना चाहता है और कोड के दूसरे बिट को बी लॉक किया गया है और रिकॉर्ड ए के लिए इंतजार कर रहा है।

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

लॉकिंग के इस समय का वर्णन करने के लिए "स्पष्ट लॉकिंग" शब्द का भी उपयोग किया जाता है।

+0

+1 महान उत्तर, धन्यवाद। मैं अधिक प्रतिक्रियाओं को प्रोत्साहित करने की उम्मीद में 24 घंटे के लिए अनुत्तरित प्रश्न छोड़ दूंगा। –

+0

अपने ब्राउज़र को खोलते समय दोपहर के भोजन या छुट्टी पर जाने वाले व्यक्ति से सावधान रहें। इस बात पर विचार करें कि आपको उपयोगकर्ताओं के लिए किसी प्रकार का यूआई या अन्य लोगों के ताले तोड़ने के लिए प्रबंधक की आवश्यकता है या नहीं। (अनुभव से बोलते हुए।) –

1

मैंने इसे मैन्युअल रूप से किया है।

  • रिकॉर्ड की प्राथमिक कुंजी को लॉक टेबल पर स्टोर करें, और रिकॉर्ड करने के लिए मोड विशेषता रिकॉर्ड करें।
  • जब कोई अन्य उपयोगकर्ता इस रिकॉर्ड का चयन करने का प्रयास करता है, तो उपयोगकर्ता का केवल रिकॉर्ड रिकॉर्ड करें।
  • रिकॉर्ड लॉक करने के लिए अधिकतम सेट अप सेट करें।
  • लॉक किए गए रिकॉर्ड के लिए पृष्ठ डेटा रीफ्रेश करें। जबकि उपयोगकर्ता को परिवर्तन करने की अनुमति है, अन्य सभी उपयोगकर्ताओं को केवल जांच करने की अनुमति है।

    User_ID, //who locked 
    Lock_start_Time, 
    Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row. 
    Table_Name(Entity_Name) //table name of the locked row. 
    

    शेष तर्क कुछ आप यह पता लगाने की है:

ताला तालिका इस के समान डिजाइन होना चाहिए।

यह सिर्फ एक विचार है जिसे मैंने 4 साल पहले एक ग्राहक के विशेष अनुरोध पर लागू किया था। उस ग्राहक के बाद किसी ने मुझे कुछ भी ऐसा करने के लिए फिर से नहीं पूछा है, इसलिए मैंने कोई अन्य विधि हासिल नहीं की है।

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