【问题标题】:JDO Exception in google app engine transaction谷歌应用引擎事务中的 JDO 异常
【发布时间】:2010-12-11 18:44:09
【问题描述】:

尝试在应用引擎数据存储区中使用事务时出现以下异常。

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)

以下是我使用的sn-p代码:

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();
}

【问题讨论】:

    标签: google-app-engine jdo


    【解决方案1】:

    如果提交或 makePersistent 失败,“回滚”的调用在哪里?

    【讨论】:

      【解决方案2】:

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

      ,您将不会收到此消息

      事务 trans = manager.currentTransaction(); trans.begin();

      到上面的 try { } 部分是这样的:

      PersistenceManager pm = PMF.get().getPersistenceManager(); 交易 tx = pm.currentTransaction(); tx.begin(); 尝试 { //做我的事 tx.commit(); } } 捕捉(异常 e){ tx.rollback(); } 最后 { pm.close(); }

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

      【讨论】:

        【解决方案3】:

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

        您可以在循环中开始事务,因此您将一次对一个实体进行操作,或者确保您的所有对象都在同一个组中。

        【讨论】:

          猜你喜欢
          • 2012-04-20
          • 2023-03-07
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-27
          • 2014-10-27
          • 1970-01-01
          相关资源
          最近更新 更多