谷歌应用引擎交易中的JDO异常

时间:2010-12-11 18:44:09

标签: google-app-engine jdo

尝试在app引擎数据存储区中使用事务时,我收到以下异常。

javax.jdo.JDOUserException: Transaction is still active.
You should always close your transactions correctly using commit() or rollback().

FailedObject:org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@12bbe6b
at org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:277)

以下是我使用的代码段:

List<String> friendIds = getFriends(userId);
Date currentDate = new Date();
PersistenceManager manager = pmfInstance.getPersistenceManager();
try {
   Transaction trans = manager.currentTransaction();
   trans.begin();
   for(String friendId : friendIds) {
      User user = manager.getObjectById(User.class, friendId);
      if(user != null) {
         user.setRecoCount(user.getRecoCount() + 1);
         user.setUpdatedDate(currentDate);
         manager.makePersistent(user);
      }
   }
   trans.commit();
} finally {
   manager.close();
}

3 个答案:

答案 0 :(得分:3)

如果commit或makePersistent失败,那么对“rollback”的调用是什么?

答案 1 :(得分:1)

我能够重现这一点 - 如果你在try块中声明你的事务并在finally中关闭pm。如果移动

,您将不会收到此消息

Transaction trans = manager.currentTransaction(); trans.begin();

在try {}部分之上,如下所示:

PersistenceManager pm = PMF.get()。getPersistenceManager(); 事务tx = pm.currentTransaction(); tx.begin();  尝试{ //做我的事  tx.commit(); } } catch(例外e){    tx.rollback(); } finally {    pm.close(); }

javax.jdo.JDOUserException:交易仍处于活动状态。您应该始终使用commit()或rollback()正确关闭事务。

答案 2 :(得分:0)

我认为不同的“用户”对象不属于同一个实体组。事务中的所有数据存储区操作都必须对同一实体组中的实体进行操作。

您可以在循环内开始交易,这样您就可以一次操作一个实体,或者确保所有对象都在同一个组中。