2010-12-11 65 views
1

Je reçois l'exception suivante en essayant d'utiliser la transation dans la banque de données du moteur de l'application.Exception JDO dans la transaction google app engine

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) 

Voici l'extrait de code je:

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

Répondre

3

et si la validation ou makePersistent échoue où est l'appel à "rollback"?

0

Je pense que les différents objets 'User' n'appartiennent pas au même groupe d'entités. Toutes les opérations de banque de données dans une transaction doivent fonctionner sur des entités appartenant au même groupe d'entités.

Vous pouvez commencer la transaction à l'intérieur de la boucle, de sorte que vous opérerez sur une entité à la fois, ou assurez-vous que tous vos objets sont dans le même groupe.

1

J'ai été capable de reproduire ceci - si vous déclarez votre transaction dans le bloc try et fermez le pm dans le finalement. Vous ne recevrez pas ce message si vous déplacez votre

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

au-dessus de la section essayer {} comme ceci:.

PersistenceManager h = PMF.get() getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); try { // fait mon truc tx.commit(); } } catch (Exception e) { tx.rollback(); } enfin { pm.close(); }

javax.jdo.JDOUserException: la transaction est toujours active. Vous devriez toujours fermer vos transactions correctement en utilisant commit() ou rollback().