Я читаю официальную документацию 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
?