2010-12-11 4 views
1

アプリエンジンデータストアでトランジションを使用しようとしているときに、次の例外が発生します。Googleアプリケーションエンジントランザクションでの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つのエンティティで操作するか、すべてのオブジェクトが同じグループに含まれていることを確認してください。

1

トランザクションをtryブロック内に宣言し、最後にpmを閉じると、これを再現することができました。

トランザクショントランス= manager.currentTransaction();このメッセージは表示されません。 trans.begin();

に、このような試み{}セクション上:

のPersistenceManager PM = PMF.get()getPersistenceManager(); トランザクションtx = pm.currentTransaction(); tx.begin(); try { //私のことをしてください tx.commit(); } } catch(例外e){ tx.rollback(); }最後に{ pm.close(); }

javax.jdo.JDOUserException:トランザクションはまだアクティブです。 commit()またはrollback()を使用して、トランザクションを常に正しく終了する必要があります。

関連する問題