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().
aussi bon article http://progrnotes.blogspot.com/2017/02/spring-transactions-managements.html – Sergey