2016-12-06 3 views
0

J'ai la transaction hibernate & hibernate configurée (aop sur chaque appel de service et retour pour Throwable). Je dois soutenir folowing requierements pour cretePartA():Partie de transaction de restauration de printemps

  • ne devrait pas manquer transaction principale, cteateSmth() dans mon exemple
  • shoud rollback sa propre transaction si est pas

    service1.cteateSmth() ;

    /*started in new transaction*/ 
    public void cteateSmth() 
    { 
        //...some other inserts 
    
        // should not fail main transaction, 
        // but shoud rollback it's own if is failed 
        anotherService.cretePartA(); 
    
        //should save state in db in any case 
        recordSmthCreation(); 
    } 
    
    public void cretePartA(){ 
        updateSubpartA(); 
        updateSubPartA1();  
        if(!sucees) throw new ValidationException(); 
    
    } 
    

Dans l'exemple ci-dessus, même wiht emballage de capture d'essayer pour la transaction cretePartA(), toute cteateSmth() sera annulée.

J'ai essayé ceci avec REQUIRES_NEW, mais il semble que je ne peux pas annuler les actions cretePartA() dans un tel cas.

TransactionDefinition transactionDefinition = new DefaultTransactionAttribute(TransactionDefinition.Propagation.REQUIRES_NEW); 
new TransactionTemplate(transactionManager, transactionDefinition).execute(new TransactionCallback() 
{ 
    @Override 
    public Object doInTransaction(TransactionStatus status) 
    { 
     try{ 
      cretePartA() 
     } catch (Exception e){ 

     } 
     return null; 
    } 
}); 

J'ai essayé de ne pas créer de nouvelles transactions pour cretePartA(), juste excelude cet appel de service à partir aop printemps. Mais dans ce cas, le résultat sera commmited pour cretePartA().

Répondre

0

Je l'ai résolu avec annotaion @Transactional(propagation = Propagation.REQUIRES_NEW) pour la méthode cretePartA() et bloc try/catch

+0

aussi bon article http://progrnotes.blogspot.com/2017/02/spring-transactions-managements.html – Sergey