2016-04-21 4 views
1

J'apprends le printemps et j'ai des problèmes de transaction au printemps.Redémarrage de la transaction en cas d'exception au printemps

Voici mon code

@Transactional(rollbackFor = Exception.class) 
public void createGroupStudent(Student A,Student B,String nameGroup){ 
    try{ 
     //create Group 
     createGroup(nameGroup); 
     //createMember 
     createMember(A,B); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

@Transactional(rollbackFor = Exception.class) 
public void createGroup(String nameGroup){ 
    try{ 
     repoGroup.save(nameGroup); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

@Transactional(rollbackFor = Exception.class) 
public void createMember(Student A,Student B){ 
    try{ 
     // function will throw a kind of Exception involve to " error constraint sql oracle " . 
     //It's my intended 
     repoMember.save(A,B); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

Le problème est lorsque la fonction createMember() throws Exception, rollback transaction alway pourquoi? Je ne peux pas comprendre ce qui est arrivé! J'ai ajouté essayer, attraper dans chaque méthode, mais cela n'a pas fonctionné.

Bien que la méthode createMember() rencontre des problèmes lors de l'enregistrement dans la base de données (ici j'utilise la fonction saveAndFlush()) .Je le sais et j'attrape cette exception. La transaction parente createGroupStudent() pense elle-même qu'il n'y a pas de problème et que la transaction est validée. Mais quand valider une fois de plus la méthode createMember() va casser et jeter Exception.Je pense que la méthode createGroup() ne reviendra pas. Mais en réalité, cette fonction a été annulée, toutes les transactions ont été annulées? Qu'est-il arrivé?. J'utilise transaction atomikos.

Merci beaucoup

Répondre

1

Si vous utilisez Hibernate, pensez à ce scénario.

Lorsque repoMember.save (A, B); est exécuté, la session de mise en veille prolongée n'a pas vidé la session (c'est-à-dire, exécute save sql) util createMember() est terminée. Quand hibernate efface et exécute le save sql, cette erreur se produit. C'est pourquoi vous pourriez ne pas être en mesure d'attraper cette exception qui provoque votre annulation de transaction.

est lien ici qui pourrait être utile http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/

2

Si l'une des méthodes Exception lancers francs, la transaction rollback. Mais aucune des méthodes ne lance Exception. Retiffez le Exception dans le bloc catch, cela fonctionnera.Vérifiez la documentation pour l'annotation Transactional.

+0

Merci. Mais quand j'attrape des exceptions. Transaction toujours en cours? Je ne comprends pas @. @. –

+0

Comment avez-vous vérifié si la transaction est rollback? Il se peut que la transaction ne soit pas validée. Vérifiez votre configuration. – Adi

+0

Je pense, bien que la méthode createMember() rencontre des problèmes lors de l'enregistrement dans la base de données (ici j'utilise la fonction 'saveAndFlush()'). Je le sais et j'attrape cette exception. Transaction précaire createGroupStudent() pense que ce n'est pas un problème et une transaction de validation. Mais quand commit encore une fois la méthode createMember() va se casser et lancer Exception. Je pense que la méthode createGroup() ne sera pas restaurée. Mais en réalité, cette fonction était rollback, toutes les transactions étaient rollback? Que c'est il passé ???? . C'est mes problèmes :(J'utilise la transaction atomikos –