10

"लेन-देन के लिए उपयोग करता है" में दूसरा उदाहरण ("अगर यह अभी तक मौजूद नहीं है एक नामित कुंजी के साथ एक इकाई अद्यतन करें, या इसे बनाने के") पर विचार करें:जीएई एचडीआर: क्या एक्सजी लेनदेन के भीतर अंततः लगातार कुंजी द्वारा इकाई पुनर्प्राप्तियां होती हैं?

https://developers.google.com/appengine/docs/java/datastore/transactions

अब इस परिदृश्य पर विचार करें। एक मल्टीप्लेयर गेम किसी भी दो खिलाड़ियों के बीच केवल एक मैच की अनुमति देता है। यह सुनिश्चित करने के लिए, प्रत्येक खिलाड़ी की चाबियों का उपयोग करके एक कुंजी बनाई जाती है। इस कुंजी को UniqueMatch इकाई की कुंजी के रूप में प्रयोग किया जाता है।

तो एक मैच बनाने के लिए, एक एक्सजी लेनदेन बनाया गया है। इस लेनदेन के भीतर:

  1. हम जांचते हैं कि पहले से ही उस कुंजी के साथ अनन्य मैच इकाई नहीं है या नहीं। यदि उस कुंजी का उपयोग करके datastore.get() कॉल EntityNotFoundException को फेंक नहीं देता है, तो हम जानते हैं कि उन दो खिलाड़ियों के बीच एक मैच पहले से मौजूद है, इसलिए हम रोलबैक() और खिलाड़ियों को एक त्रुटि संदेश दिखाते हैं।

  2. हम सभी इकाइयों को एक मैच बनाने के लिए रखने की जरूरत है। इसमें अनन्य मैच इकाई, साथ ही कुछ अन्य कुछ इकाइयां भी शामिल हैं।

  3. लेनदेन तब किया जाता है।

ऐसा लगता है कि यह ठीक काम करता है। हालांकि, मैंने देखा कि मैं कम समय की खिड़की के भीतर किसी भी दो खिलाड़ियों के बीच दो मैचों का निर्माण कर सकता हूं। थोड़े समय के लिए (वास्तव में परीक्षणों में से एक में 10-20 तक), datastore.get (कुंजी) पर मेरी कॉल EntityNotFoundException को फेंक देती है भले ही उस कुंजी को पहले ही रखा जा चुका है()।

यह अंततः स्थिरता प्रतीत होता है। लेकिन कुंजी द्वारा दृढ़ता से सुसंगत होने की गारंटी नहीं है? क्या यह गारंटी इस तथ्य से प्रभावित है कि यह एक एक्सजी लेनदेन के भीतर किया जाता है?

अग्रिम धन्यवाद,

+0

इस एक समान मुद्दा हो सकता है में खिलाड़ियों के साथ बनाई गई है बनाने सुनिश्चित करें। मुझे टिप्पणियों में यह गलत लगता है, Guido की टिप्पणी देखें। http://stackoverflow.com/questions/12367904/write-read-with-high-replication-datastore-ndb/12368444 मुझे यह भी यकीन था कि एक बार जब आप एक .put से एक कुंजी वापस ले लेंगे तो आप हमेशा आइटम को पुनर्प्राप्त कर सकते हैं लेकिन यह ऐसा नहीं लगता है। शायद यह memcache। –

+0

हमम मुझे इसके बारे में इतना यकीन नहीं है, Guido विशेष रूप से प्रश्नों के बारे में बात कर रहा है, कुंजी द्वारा इकाई पुनर्प्राप्ति नहीं। प्रश्नों के लिए, मैं अंतिम स्थिरता की अपेक्षा करता हूं (जो वास्तव में सही ढंग से दस्तावेज है)। Memcache एक विकल्प हो सकता है, हाँ। अगर मुझे कोई बेहतर तरीका नहीं मिल रहा है, तो मैं memcache में देखूंगा, धन्यवाद। – fnf

+0

सुनिश्चित करें, आपने कुंजी द्वारा इकाई का उल्लेख किया है, इसलिए मैंने सोचा कि मैं उस चर्चा को जोड़ दूंगा। मैं आपके प्रश्न को उखाड़ फेंक दूंगा। –

उत्तर

1

मुझे लगता है कि इस मुद्दे को आप क्योंकि डेटासंग्रह (कुंजी या प्रश्नों द्वारा) हो जाता है हो सकता है देख रहे हैं केवल लेन-देन के शुरू पर डेटासंग्रह के राज्य में देखते हैं।

docs (अलगाव और स्थिरता के तहत) से:

एक सौदे में, पढ़ता समय लेनदेन शुरू हो गई थीं डेटास्टोर की वर्तमान, लगातार राज्य को दर्शाते हैं। इसमें लेनदेन के अंदर पिछले रखे और हटाए गए शामिल नहीं हैं। प्रश्नों और लेनदेन के अंदर हो जाता है, लेनदेन की शुरुआत के रूप में डेटास्टोर के एकल, लगातार स्नैपशॉट को देखने की गारंटी दी जाती है।

इसके अलावा, लेन-देन के बाहर, आप केवल डालता है (docs) प्रतिबद्ध किया गया है देखेंगे:

संस्थाओं प्रश्नों द्वारा डेटासंग्रह से लिया गया या केवल प्रतिबद्ध डेटा देखेंगे हो जाता है।

सम्भावित समाधान:

लेनदेन के बाहर UniqueMatch इकाई बनाएं (इसलिए यह अगर इकाई एक अपवाद फेंक देंगे ऐप्लिकेशन इंजन, आप एक ही कुंजी के साथ एक इकाई लगाने के लिए अनुमति नहीं दी जाएगी एक ही कुंजी के साथ पहले से मौजूद है)। फिर आप एक लेनदेन के अंदर एक मैच बनाने के लिए आवश्यक अन्य इकाइयों को बना/रख सकते हैं (यदि आवश्यकता हो)।

अन्त में, जब UniqueMatch के लिए महत्वपूर्ण है कि वे कुंजी हमेशा एक ही क्रम क्योंकि key(playerA,playerB)!=key(playerB,playerA)

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

  • कोई संबंधित समस्या नहीं^_^