2010-12-11 28 views
1

嘗試在應用程序引擎數據存儲區中使用轉換時,出現以下異常。谷歌應用程序引擎事務中的JDO異常

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

FailedObject:org[email protected]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

,如果提交或makePersistent這個失敗,其中調用「回滾」?

0

我認爲不同的'用戶'對象不屬於同一個實體組。交易中的所有數據存儲操作必須對同一實體組中的實體進行操作。

您可以在循環內開始事務,因此您將一次在一個實體上操作,或者確保您的所有對象都在同一組中。

1

我能夠重現這一點 - 如果你在try塊中聲明你的事務並在finally中關閉pm。如果您移動

,您將不會收到此消息事務trans = manager.currentTransaction(); trans.begin();

上述嘗試{}部分是這樣的:

的PersistenceManager PM = PMF.get()getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); 嘗試{ //做我的事 tx.commit(); } } catch(Exception e){ tx.rollback(); } finally { pm.close(); }

javax.jdo.JDOUserException:事務處於活動狀態。您應該始終使用commit()或rollback()正確地關閉事務。