Когда возникает исключение ConcurrentModificationException в GAE?

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

6
задан Dan McGrath 30 November 2016 в 09:17
поделиться