शायद स्पष्ट प्रश्न लेकिन मुझे इसके लिए एक सुंदर समाधान नहीं मिल रहा है

एक बहुप्रचारित नियंत्रक से शुरू की गई स्प्रिंग सेवा में मैं एक तृतीय पक्ष से अनुरोध संसाधित करता हूं जिसमें एक पुष्टिकरण कोड और टर्मिनल नंबर का संयोजन होता है। एक बार जब हम इस अनुरोध को संसाधित कर लेते हैं तो हम इस संयोजन को डेटाबेस में बनाए रखते हैं और इस संयोजन को फिर से संसाधित करने की अनुमति नहीं देते हैं। छद्म कोड इस प्रकार है:

protected void processAdmission(String confirmationCode, String terminalCode) 
throws AdmissionException {

    //Check availability in the database
    boolean isAvailable = checkDatabaseAvailability(confirmationCode, terminalCode);
    if (!isAvailable)
    {
        throw new AdmissionException();
    }
    saveInDatabase(confirmationCode, terminalCode);         
}

इस अद्वितीय संयोजन को केवल एक बार संसाधित करने की अनुमति है; अगली बार यह एक त्रुटि होनी चाहिए क्योंकि यह संयोजन पहले से ही डेटाबेस में है और हम डेटाबेस की जांच करते हैं। क्या होगा अगर यह अनूठा संयोजन एक साथ दो बार आता है? डेटाबेस सुरक्षा मदद नहीं करेगी क्योंकि डेटा अभी तक डेटाबेस में नहीं है।

1
Alex 13 जुलाई 2016, 02:38

4 जवाब

सबसे बढ़िया उत्तर

अंत में, मैंने नई तालिका बनाई और अद्यतन लॉकिंग के लिए चयन का उपयोग किया

0
Alex 4 सितंबर 2016, 01:24

यह मानते हुए कि आपके पास उपयुक्त अद्वितीय बाधाएं हैं और लेनदेन का उपयोग कर रहे हैं:

  • आप काम करते हैं
  • डेटाबेस में मान डालें
  • लेन-देन करना।

अगर प्रतिबद्धता सफल होती है, तो सब ठीक है। यदि प्रतिबद्धता एक UniqueConstraintViolation फेंकता है, तो कोड पहले से ही उपयोग किए जाते हैं और उन्हें अस्वीकार कर दिया जाना चाहिए (और लेनदेन वापस ले लिया जाएगा ताकि आपके द्वारा किया गया कोई भी काम पूर्ववत हो)।

1
jtahlborn 13 जुलाई 2016, 02:55

यह मानते हुए कि आपका डेटा एक रिलेशनल डेटाबेस द्वारा समर्थित है, आप अपने डेटाबेस पर भरोसा कर सकते हैं। यदि जोड़ी (पुष्टिकरण कोड, टर्मिनल कोड) एक ही तालिका में बनी रहती है, तो जोड़ी पर प्राथमिक कुंजी या अद्वितीय बाधा विशिष्टता को बरकरार रखेगी।

1
Gabriel Belingueres 13 जुलाई 2016, 02:56

मुझे लगता है कि आवेदन स्तर पर इसे रोकना बहुत कठिन है। विचार करें कि आपके पास एक से अधिक सर्वर हैं और चल रहे हैं जो terminal number और confirmation code के समान संयोजन प्राप्त करते हैं, तो आप खराब हैं :-)

यदि केवल एक उदाहरण और एक JVM है, तो आप संख्या/कोड को सहेजने के लिए static HashSet के साथ एक वर्ग बनाएं और एक synchronized static विधि का उपयोग कर सकते हैं जो जोड़ता है और जांचता है कि क्या संयोजन पहले से मौजूद है। हालांकि यह काम करना चाहिए, अपने विशेष वातावरण में synchronized कीवर्ड के संभावित नुकसान से अवगत रहें।

यहाँ एक उदाहरण है जहाँ combination number और code की संयुक्त स्ट्रिंग है

public CombinationValidator {
  private static HashSet<String> combinations;

  public static synchronized boolean addAndCheck(String combination) {
      if (combinations.contains(combination)) {
          return false;
      } else {
          combinations.add(combination);
          return true;
      }        
   }
}

अंत में, यह आपका डेटाबेस है जिसे इसकी देखभाल करने की आवश्यकता है। आपके डीबीएमएस के आधार पर आपको अद्वितीय कुंजी बाधाओं को परिभाषित करने की आवश्यकता होगी। फिर डेटाबेस को यह बताने के लिए प्रतीक्षा करें कि क्या सम्मिलित सफल रहा है। यदि ऐसा है, तो अनुरोध को संसाधित करना जारी रखें। यदि नहीं, तो AdmissionException फेंकें।

1
Matt 13 जुलाई 2016, 03:01