Estoy leyendo el GAE oficial documentation on transactions y no puedo entender cuando se arroja un ConcurrentModificationException
.¿Cuándo se lanza la ConcurrentModificationException en GAE?
vistazo a uno de los ejemplos que estoy copiar y pegar aquí:
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();
}
}
}
Ahora, todas las escrituras en el almacén de datos (en este ejemplo) se envuelven en virtud de una transacción. Entonces, ¿por qué se lanzaría un ConcurrentModificationException
?
¿Ocurre cuando algún otro código que no está envuelto en una transacción actualiza la misma entidad que está siendo modificada por el código anterior? Si me aseguro de que todo el código que actualiza una entidad siempre esté envuelto en una transacción, ¿se garantiza que no recibiré un ConcurrentModificationException
?
¿Cómo es eso diferente del segundo párrafo de la cita que proporcioné? – Kiril
Lirik, no es muy diferente de la cita que incluyó. Pero su resumen debajo de la cita es diferente al mío, y hay algunas suposiciones y citas no relacionadas en la respuesta. Por lo tanto, hice una nueva respuesta mientras aclaraba mis propias confusiones. Gracias por participar en esta búsqueda. – HRJ
Bueno, lo importante es que tienes una respuesta:) ... – Kiril