2012-07-10 31 views
0

我剛剛同步了我的java代碼,以避免多次訪問同一個列表。這是我的代碼:GAE中的列表訪問同步

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

GAE交易不做鎖定:他們使用optimistic concurrency control,這意味着如果多個交易改變的實體組,首先會取得成功其他人將失敗,需要重新嘗試。

+0

uhm ..所以所有的同步都是無用的嗎?唯一的方法是捕捉異常並重試? – 2012-07-10 20:19:38

+0

例如,我也嘗試同步該方法,但它不起作用。 – 2012-07-10 20:38:42

+0

Java同步在JVM中工作。它不適用於多個GAE實例。所以它在GAE等分佈式環境中無用。 – 2012-07-11 07:57:42