ti-enxame.com

Criando uma confirmação de postagem ao usar a transação no Spring

Devido a certas razões, executei manualmente a confirmação e a reversão da transação usando o Spring PlatformTransactionManager, o que preciso fazer é configurar um gancho para que uma ação pós-confirmação ocorra após a confirmação da transação.

Ao olhar para:

 void commit(TransactionStatus status) throws TransactionException;

Eu não consigo ver como posso determinar que uma transação foi bem-sucedida, além de assumi-la, se nenhuma exceção for lançada.

E eu poderia usar o AOP como uma opção, mas que tal fazer programmitcally, talvez usando o método de retorno de chamada?

28
user1555190

Você pode obter exatamente o que deseja de uma maneira mais simples, com TransactionSynchronizationManager e TransactionSynchronization

Com TransactionSynchronizationManager, você tem métodos estáticos para obter informações sobre a transação atual e pode registrar um TransactionSynchronization que permite executar automaticamente uma pós-confirmação conforme você chama isso

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

Esteja ciente de que o TransactionSynchronization é realizado por thread (o que geralmente não é um problema para uma solicitação básica da Web).

48
Grooveek

Agradecemos a resposta de Grooveek e o comentário de Alex - coloquei isso aqui porque as sugestões combinadas fornecem uma solução sólida e mais limpa, difícil de encontrar na rede.

Usando o Spring 4+. se você precisar de um retorno de chamada em um método @Transactional depois que ele confirmar com êxito, basta adicioná-lo no início do método:

@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
Michail Michailidis

Em um dos meus projetos, devido a certas razões, eu também tive que usar PlatformTransactionManager. Então eu forcei a usar org.springframework.transaction.support.TransactionTemplate.

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

O principal benefício é que, se você implementou o PlatformTransactionManager corretamente, não precisa se preocupar com a confirmação/reversão manual. Pelo menos o código-fonte do TransactionTemplate pode ajudá-lo se você precisar de algo mais específico.

É muito simples de usar:

config.xml

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

MyServiceImpl.Java

 
 @ Serviço 
 Classe pública MyServiceImpl implementa MyService {
 
 @Autowired 
 Private TransactionTemplate transactionTemplate; 
 
 Entidade pública getSomethingWithTx (identificação longa final) {
 
 retorne transactionTemplate.execute (new TransactionCallback <Entity> () {
 @Override 
 Entidade pública doInTransaction (status TransactionStatus) {
 // TODO implementa 
} 
}); 
} 
 
1
n1ckolas