2010-02-02 3 views
3

En utilisant JDO sur GAE, j'utilise un bloc de code de transaction de base de données simple comme ci-dessous.comment réessayer/récupérer à partir d'une exception java.sql.SQL: Modification simultanée

Quel est un bon moyen de réessayer/récupérer à partir d'une java.sql.SQLException levée: Modification simultanée?

private final Fournisseur pmp; ...

PersistenceManager pm = pmp.get(); try { pm.currentTransaction(). Begin();

MyObject myObject = pm.getObjectById (MyObject.class, id);

pm.currentTransaction(). Commit();

} finally {

si (pm.currentTransaction() isActive().) { log.severe (this.getClass() getName() + "exception DATABASE pris.".); pm.currentTransaction(). Rollback(); } }

Répondre

0

Où cette exception est-elle réellement levée? Etes-vous sûr de la sémantique de commit() et isActive()? commit() pourrait créer automatiquement une nouvelle transaction laissant la transaction toujours active. Mon autre hypothèse serait que c'est un bean singleton accédé simultanément et ils se retrouvent tous dans la même transaction avec d'autres requêtes modifiant simultanément votre objet demandé.

+0

Merci d'avoir suggéré de regarder de plus près la sémantique. En regardant de plus près la trace de la pile et les javadocs. L'exception est lancée à partir de commit() et l'exception java.sql est imbriquée dans une javax.jdo.JDODataStoreException qui est une sous-classe de JDOCanRetryException http://db.apache.org/jdo/api23/apidocs/ javax/jdo/JDODataStoreException.html Maintenant, existe-t-il un moyen d'attraper cette exception et réessayer l'opération sans exporter toutes les variables dans un seul bloc de paramètres? – Stevko

+0

Je pense toujours que cette exception ne devrait pas être levée. Votre niveau de sérialisation est-il correctement défini? Vous ne pouvez pas essayer de valider jusqu'à currentTransaction(). IsActive()? – sibidiba

Questions connexes