在GAE中列出访问同步

时间:2012-07-10 18:41:06

标签: java google-app-engine synchronization jdo datanucleus

我刚刚同步了我的java代码,以避免多次访问同一个List。这是我的代码:

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,但我不认为它会影响这种行为

1 个答案:

答案 0 :(得分:1)

GAE事务不执行锁定:它们使用optimistic concurrency control,这意味着如果多个事务更改同一个实体组,则第一个将成功,其他事务将失败并且需要重试。