web-dev-qa-db-fra.com

Création d'un post-commit lors de l'utilisation d'une transaction au printemps

Pour certaines raisons, j'ai effectué manuellement la validation et la restauration des transactions à l'aide de Spring PlatformTransactionManager, ce que je dois faire est de configurer un hook afin qu'une action de post-validation ait lieu après la validation de la transaction.

En regardant:

 void commit(TransactionStatus status) throws TransactionException;

Je ne peux pas voir comment je peux déterminer qu'une transaction a réussi, à part la supposer, donc si aucune exception n'est levée.

Et je pourrais utiliser AOP comme une option, mais qu'en est-il de le faire par programmation, peut-être en utilisant la méthode de rappel?

28
user1555190

Vous pouvez obtenir exactement ce que vous voulez d'une manière plus simple, avec TransactionSynchronizationManager et TransactionSynchronization

Avec TransactionSynchronizationManager, vous disposez de méthodes statiques pour obtenir des informations sur la transaction en cours et vous pouvez enregistrer un TransactionSynchronization qui vous permet d'effectuer automatiquement une post-validation lorsque vous l'appelez

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
           void afterCommit(){
                //do what you want to do after commit
           }
})

Sachez que TransactionSynchronization se fait sur une base par thread (ce qui n'est souvent pas un problème pour une demande Web de base).

48
Grooveek

Mention à la réponse de Grooveek et au commentaire d'Alex en dessous - Je mets cela ici parce que les suggestions combinées fournissent une solution solide et plus propre qui est difficile à trouver sur le net.

Utilisation de Spring 4+. si vous avez besoin d'un rappel sur un @Transactional méthode après sa validation réussie, il suffit d'ajouter qu'au début de la méthode:

@Service
public class OneService {

    @Autowired
    OneDao dao;

    @Transactional
    public void a transactionalMethod() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
            public void afterCommit(){
                //do stuff right after commit
                System.out.println("commit!!!");

            }
        });
        //do db stuff
        dao.save();
    }
}
15

Dans l'un de mes projets, pour certaines raisons, j'ai également dû utiliser PlatformTransactionManager. J'ai donc forcé à utiliser org.springframework.transaction.support.TransactionTemplate.

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/support/TransactionTemplate.html

Le principal avantage est que si vous avez correctement implémenté PlatformTransactionManager, vous n'avez pas à vous soucier de la validation/restauration manuelle. Au moins le code source de TransactionTemplate peut vous aider si vous avez besoin d'une chose plus spécifique.

C'est assez simple à utiliser:

config.xml

<bean name="transactionTemplate"
            class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="platformTransactionManager"/>
</bean>

MyServiceImpl.Java

 
 @ Service 
 Classe publique MyServiceImpl implémente MyService {
 
 @Autowired 
 Private TransactionTemplate transactionTemplate; 
 
 entité publique getSomethingWithTx (identifiant long final) {
 
 return transactionTemplate.execute (new TransactionCallback <Entity> () {
 @Override 
 Entité publique doInTransaction (état TransactionStatus) {
 // TODO implémente 
} 
}); 
} 
 
1
n1ckolas