私は公式の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
を取得しないことが保証されますか?
私は提供した見積もりの第2段落とどう違うのですか? – Kiril
Lirik、それはあなたが含まれている引用とあまり変わらない。しかし、見積もりの下の要約は私のものとは異なり、答えにはいくつかの前提と無関係な引用があります。それで、私は自分の混乱を明確にしながら新鮮な答えを出しました。このクエストに参加してくれてありがとう。 – HRJ
さて、重要なことはあなたに答えがあることです:)... – Kiril