2010-09-08 14 views
7

मैं एक ऐसा एप्लीकेशन लिख रहा हूं जो किसी तीसरे पक्ष के डेटासोर्स से सिंक की इकाइयों को हमारे स्वयं के स्कीमा में बदलता है, जिसमें एक रूपांतरण/मानचित्रण चरण के बीच होता है। मैं अपनी खुद की स्कीमा में इकाइयों का प्रतिनिधित्व करने और बनाए रखने के लिए हाइबरनेट का उपयोग कर रहा हूं। एक समस्या जो मैं चल रहा हूं वह यह है कि मेरे पास मेरी एक तालिका में एक अद्वितीय मल्टी-कॉलम कुंजी है। जिस व्यवहार को मैं देखना चाहता हूं वह एक अपरिपक्व के समान है: जब हाइबरनेट एक इकाई को बनाए रखने के लिए जाता है और एक अद्वितीय बाधा उल्लंघन का पता लगाता है, तो यह इसके बजाय एक अद्यतन करता है। हम MySQL का उपयोग कर रहे हैं, जो एक INSERT प्रदान करता है ... डिप्लिकेट कुंजी अद्यतन वाक्यविन्यास पर, लेकिन मुझे यकीन नहीं है कि इसका उपयोग करने के लिए हाइबरनेट कैसे बनाया जा सकता है?हाइबरनेट का उपयोग कर अपरिवर्तनीय व्यवहार की नकल कैसे करें?

मुझे लगता है कि मैं हमेशा सम्मिलित करने का प्रयास कर सकता हूं, और यदि मैं अपवाद पकड़ता हूं तो एक अद्यतन करता है, लेकिन यह हैकी और उप-स्थानिक लगता है। ऐसा करने के लिए एक साफ तरीके पर कोई सुझाव?

उत्तर

4

हम MySQL का उपयोग कर रहे हैं, जो एक INSERT प्रदान करता है ... डिप्लिकेट कुंजी अद्यतन वाक्यविन्यास पर, लेकिन मुझे यकीन नहीं है कि इसका उपयोग करने के लिए हाइबरनेट कैसे बनाया जा सकता है?

यह कोई है did itsql-insert बयान इस इकाई के लिए हाइबरनेट द्वारा प्रयोग किया जाता अधिभावी द्वारा तरह दिखता है। यदि आपको पोर्टेबल नहीं होना चाहिए (और शायद संग्रहीत प्रक्रिया का उपयोग करना), तो एक नज़र डालें।

मुझे लगता है कि मैं हमेशा सम्मिलित करने का प्रयास कर सकता हूं, और यदि मैं अपवाद पकड़ता हूं तो एक अद्यतन करता है, लेकिन यह हैकी और उप-स्थानिक लगता है। ऐसा करने के लिए एक साफ तरीके पर कोई सुझाव?

एक अन्य विकल्प होगा:

  1. अगर आप किसी रिकॉर्ड को खोजने के अद्वितीय कुंजी
  2. पर एक का चयन करते हैं, तो यह
  3. अद्यतन अगर आप किसी रिकॉर्ड नहीं मिल रहा है, इसे बनाने के

लेकिन जब तक आप इस प्रक्रिया के दौरान पूरे तालिका (रों) ताला, आप एक में कुछ रेस स्थिति का सामना कर सकते बहु थ्रेडेड और वितरित वातावरण और चरण # 3 संभावित रूप से असफल हो सकता है। कल्पना कीजिए कि दो समवर्ती धागे:

थ्रेड 1:

  • शुरू ट्रांस
  • एक महत्वपूर्ण
  • कोई रिकॉर्ड पर एक का चयन करता पाया
  • एक रिकॉर्ड बनाने
  • प्रतिबद्ध

थ्रेड 2:

  • ट्रांस
  • करता है एक ही कुंजी
  • पर एक का चयन करें कोई रिकॉर्ड पाया
  • एक रिकार्ड
  • प्रतिबद्ध (असफल बनाने शुरू करें! क्योंकि धागा 1 तेज थी और एक ही अद्वितीय कुंजी के साथ एक रिकॉर्ड अब मौजूद है)

तो तुम वैसे भी पुन: प्रयास तंत्र के कुछ प्रकार को लागू करने के लिए होगा (पूरे तालिका (रों ताला) एक अच्छा विकल्प IMO नहीं है) ।

3

रेस स्थिति "का चयन करें ... अद्यतन के लिए"

+3

चयन मैचों कोई भी पंक्ति, कोई भी पंक्ति "अद्यतन के लिए" द्वारा लॉक कर दिया जाएगा तो इससे बचा जा सकता। दौड़ की स्थिति से बचा नहीं है। –

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