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