Wednesday 15 April 2015

java - Can I somehow work around this particular aspect of ResourceIterator's laziness? -


जब दो समवर्ती लेनदेन t1 और t2 (I ' बोयलरप्लेट को छोड़ दें, बस मान लें कि मैं किताब से सब कुछ कर रहा हूं):

थ्रेड A: t1 :

  it1 = db findNodes (लेबल); थ्रेड बी:  टी 2 : 

    It2 = db.findNodes (लेबल); it2.forEach (नोड - & gt; नोड। RemoveLabel (लेबल))  

अब, मेरे दृष्टिकोण से, हमारे पास एक विशाल यहां असंगतता: यदि धागा एक धागा बी की तुलना में धीमी क्रियान्वित करता है, तो बिंदु पर हम जांचते हैं कि ए में नोड में लेबल label है, तो परिणाम होगा false !

एक डेवलपर के रूप में, मैं समझता हूं कि चूंकि हेटरेटर आलसी हैं, यह एक प्रकार का पूर्वानुमान है और मुझे इस व्यवहार के पीछे कारण देखते हैं, लेकिन एक एपीआई उपयोगकर्ता के तौर पर, मैं वास्तव में इस तथ्य से नाराज था कि मैं <100> यह सुनिश्चित करने में 100% निश्चित नहीं है कि जिन नोड्स को मैंने लेबल वाले के रूप में अनुरोध किया था, वे इसे नहीं करने के लिए बाहर निकलें!

ऐसी स्थिति हो, जहां किसी भी इकाई पर एक लिखना लॉक प्राप्त करना संभव नहीं है जो समवर्ती संशोधन से उन सभी नोडों की रक्षा करेगा, इसलिए मुझे कुछ अच्छे टूल के साथ भी स्थिरता नहीं मिल सकती है।

मैं वास्तव में यह मत सोचो कि यह एक बग है - बल्कि एक सुविधा जंगली गई है। हालांकि, मुझे यह पता चलने में खुशी होगी कि कोई समस्या है जो मुझे मेरी समस्या से मदद करेगी।

अपडेट: यहां बताया गया है कि यह छद्म-दौड़ की स्थिति कैसे होती है:

  इससे पहले: इसके साथ 100 नोड बनाएं: लेबल ए: इसके साथ सभी नोड्स के लिए इटेरेटर प्राप्त करें: लेबल बी: सभी नोड्स के लिए इटरेटर प्राप्त करें: लेबल ए: उदाहरण का उपभोग 50 नोड्स बी: सभी नोड्स से लेबल्स को हटा दें, ए: एडी के बाकी नोड्स को देखिए: Label  

आपको एक कठिन प्रश्न मिल गया है - चूंकि किसी ने एक जवाब का प्रयास नहीं किया है, मैं एक कोशिश करूँगा।

मुझे लगता है कि उत्तर का ब्योरा कैसे लेनदेन के साथ neo4j सौदों मेरे लिए बहुत ही प्रासंगिक लगता है, जो कहते हैं:

Neo4j में लेन-देन पठन-प्रतिबद्ध अलगाव स्तर का उपयोग करते हैं, जिसका अर्थ है कि जैसे ही यह प्रतिबद्ध हो गया है और डेटा अन्य में नहीं दिखाई देगा लेनदेन जो अभी तक प्रतिबद्ध नहीं हैं। इस प्रकार का अलगाव धारावाहिककरण से कमजोर है, लेकिन बहुत अधिक मामलों के लिए पर्याप्त होने पर महत्वपूर्ण प्रदर्शन लाभ प्रदान करता है।

मुझे लगता है कि आप लेनदेन के भीतर उन लेबलों को हटा रहे हैं मेरी पढ़ा है कि थ्रेड ए में एक भी लेबल नहीं बदल सकता है, जब तक सभी थ्रेड बी समाप्त नहीं हो जाते। इसका कारण यह है कि आप कई नोड्स से लेबल्स को हटा सकते हैं, लेकिन उसमें से किसी भी रिलेक्शन ट्रांज़ैक्शन कमाने तक किसी अन्य थ्रेड तक वास्तविक / दृश्यमान नहीं है। कम से कम यह ऐसा कैसे होना चाहिए।

इसलिए आपकी दौड़ की स्थिति यहाँ होती है, जब थ्रेड ए प्रारंभ होता है <जब थ्रेड बी निष्पादित होता है, लेकिन इससे पहले थ्रेड बी

मुझे लगता है कि आपका सबसे अच्छा जवाब शायद उस लिंक के दूसरे पैराग्राफ से आता है:

इसके अतिरिक्त, Neo4j Java API (उन्नत उपयोग देखें) स्पष्ट लॉकिंग को सक्षम करता है नोड्स और रिश्तों लॉक का उपयोग करने के लिए स्पष्ट रूप से ताले प्राप्त करने और रिलीज़ करने के द्वारा अलगाव के उच्च स्तर के प्रभावों का अनुकरण करने का अवसर मिलता है। उदाहरण के लिए, यदि कोई लिखित लॉक सामान्य नोड या रिश्ते पर लिया जाता है, तो सभी लेनदेन उस लॉक पर सीरियल करेगा - एक क्रमबद्धता अलगाव स्तर के प्रभाव को दे।

अंदर की थ्रेड बी, आप उन नोड्स के लिए चाहते हैं जिन्हें आप संशोधित कर रहे हैं। यह लेन-देन तब जारी किया जाएगा, जब लेन-देन करना होगा।

मैं इस जवाब की 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि यह समझ में आता है। अगर कोई और अनुभवी व्यक्ति इस पर सुधार कर सकता है या विरोध कर सकता है, तो कृपया अंदर जायें।


No comments:

Post a Comment