मैं आधिकारिक GAE documentation on transactions पढ़ रहा हूं और मुझे समझ में नहीं आता कि ConcurrentModificationException
फेंक दिया गया है। उदाहरण जो मैं कॉपी-पेस्ट यहाँ हूँ में से एक मेंGAE में ConcurrentModificationException फेंक दिया गया है?
देखो:
int retries = 3;
while (true) {
Transaction txn = datastore.beginTransaction();
try {
Key boardKey = KeyFactory.createKey("MessageBoard", boardName);
Entity messageBoard = datastore.get(boardKey);
long count = (Long) messageBoard.getProperty("count");
++count;
messageBoard.setProperty("count", count);
datastore.put(messageBoard);
txn.commit();
break;
} catch (ConcurrentModificationException e) {
if (retries == 0) {
throw e;
}
// Allow retry to occur
--retries;
} finally {
if (txn.isActive()) {
txn.rollback();
}
}
}
अब, डेटा स्टोर (इस उदाहरण में) के लिए सभी लेखन एक सौदे के तहत लिपटे रहे हैं। तो ConcurrentModificationException
क्यों फेंक दिया जाएगा?
क्या ऐसा होता है जब किसी अन्य कोड को लेनदेन में लपेटा नहीं जाता है, तो उसी इकाई को अद्यतन किया जाता है जिसे उपरोक्त कोड द्वारा संशोधित किया जा रहा है? अगर मैं सुनिश्चित करता हूं कि एक इकाई को अद्यतन करने वाला सभी कोड हमेशा लेनदेन में लपेटा जाता है, तो क्या यह गारंटी है कि मुझे ConcurrentModificationException
नहीं मिलेगा?
उद्धरण के दूसरे अनुच्छेद से यह अलग कैसे है? – Kiril
लिरिक, यह आपके द्वारा उद्धृत उद्धरण से बहुत अलग नहीं है। लेकिन उद्धरण के नीचे आपका सारांश मेरा से अलग है, और उत्तर में कुछ मान्यताओं और असंबंधित उद्धरण हैं। इसलिए, मैंने अपने भ्रम को स्पष्ट करते हुए एक नया जवाब दिया। इस खोज में भाग लेने के लिए धन्यवाद। – HRJ
अच्छा, महत्वपूर्ण बात यह है कि आपके पास जवाब है:) ... – Kiril