2013-09-05 5 views
0

Je suis confronté à un problème de restauration de transaction en utilisant l'annotation @Transactional.Comment annuler une transaction au printemps

Je les méthodes suivantes dans les classes backingbean, service et dao:

public class ItemBackingBean { 
    public void saveUpdate() { 
     try { 
      ItemService.executeTransaction(); 
     } 
     catch(Exception e) { 
     } 
    } 
} 

public class ItemService { 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void executeTransaction() { 
     deleteItem(); 
     createOrder(); 
    } 

    private void deleteItem() { 
     persist(); 
    } 

    private void createOrder() { 
     persist(); 
    } 

    private void persist() { 
     JpaDaoImpl.persist(object); 
     JpaDaoImpl.update(object); 
    } 
} 

public class JpaDaoImpl implements JpaDao { 
    @Transactional(readOnly = true) 
    public persist(Object object) { 
     getEm().persist(object); 
    } 

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 
    public void update(Object object) { 
     getEm().merge(object); 
    } 

    @Transactional(readOnly = true) 
    public void remove(Object object) { 
     getEm().remove(object); 
    } 
} 

Si une exception se produit dans CreateOrder(), toutes les transactions doivent rollback mais il ne se produit pas. Quelqu'un peut-il me dire le problème?

Quel est l'impact de @Transactional dans JpaDaoImpl.java? Les méthodes persist() et update() ont des valeurs radOnly différentes. Ce Dao est le code existant dans notre projet et nous ne voulons pas le changer. Quelqu'un peut-il aider?

Cordialement, BANDU

+0

après votre configuration et assurez-vous que vous utilisez une base de données qui prend en charge les transactions (MySQL avec Les tables MyISAM ne supportent pas les transactions). Le '@ Transactional' sur le dao ne fait rien (si votre configuration est correcte), le' @ Transactional' sur le service est prioritaire. –

+0

si la base de données est MySQL, les tables doivent utiliser le moteur InnoDB. – vijay

+0

Ma base de données est Oracle. Sur l'autre écran de retour en arrière fonctionne correctement. –

Répondre

0

Si une exception se produit dans toutes les transactions CreateOrder() devraient rollback mais il ne se produit pas. Quelqu'un peut-il me dire le problème?

Rollback ne se produit que pour RuntimeExceptions (voir http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html « S'il vous plaît noter que le code d'infrastructure de transaction Spring Framework, par défaut, cochez seulement une transaction pour annulation dans le cas d'exécution, exceptions non vérifiées; »), mais il est comportement personnalisable

vous pouvez garder la propagation de la transaction par défaut qui est PROPAGATION_REQUIRED sans affecter le code existant si vous voulez un comportement tout ou rien

Questions connexes