0

同じリストへの複数のアクセスを避けるために、Java コードを同期しました。ここに私のコードがあります:

List<Category> list = Collections.synchronizedList(listCat); 
..
pm.currentTransaction().begin();
..
synchronized (list) {
    for (Category category : list) {
        category.setKey(null);
        tempUser.addToCategories(category);
    }
}
..
pm.currentTransaction().commit();

..しかし、私は取得し続けます

java.util.ConcurrentModificationException: too much contention on these datastore entities. please try again.
at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:39)
at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:76)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:106)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72)
at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33)
at com.google.appengine.api.datastore.TransactionImpl.commit(TransactionImpl.java:116)
at org.datanucleus.store.appengine.jdo.DatastoreJDOTransaction.commit(DatastoreJDOTransaction.java:68)
at (the row where the transaction is committed)

.. 異なるインスタンスがそのリストにアクセスするとき。それを回避する方法はありますか?ここで指定されているものとは別の方法を意味します: Uses for Transactions

私は JDO 2.3 を使用していますが、とにかくこの動作に影響はないと思います

4

1 に答える 1

1

GAE トランザクションはロックを行いません。楽観的同時実行制御を使用します。つまり、複数のトランザクションが同じエンティティ グループを変更した場合、最初のトランザクションは成功し、他のトランザクションは失敗し、再試行する必要があります。

于 2012-07-10T19:07:00.017 に答える