java - example - transactionmanager spring 4
Creación de una confirmación de publicación cuando se utiliza la transacción en Spring (3)
En uno de mis proyectos, debido a ciertas razones, también tuve que usar PlatformTransactionManager
. Así que me org.springframework.transaction.support.TransactionTemplate
a usar org.springframework.transaction.support.TransactionTemplate
.
El principal beneficio es que si ha implementado PlatformTransactionManager correctamente, no necesita molestarse con la confirmación / reversión manual. Al menos el código fuente de TransactionTemplate puede ayudarlo si necesita algo más específico.
Es bastante simple de usar:
config.xml
<bean name="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="platformTransactionManager"/>
</bean>
MyServiceImpl.java
@Service public class MyServiceImpl implements MyService { @Autowired private TransactionTemplate transactionTemplate; public Entity getSomethingWithTx(final long id) { return transactionTemplate.execute(new TransactionCallback<Entity>() { @Override public Entity doInTransaction(TransactionStatus status) { //TODO implement } }); }
Debido a ciertas razones por las que realicé manualmente la confirmación de transacción y revertí usando Spring PlatformTransactionManager, lo que debo hacer es configurar un enlace para que se realice una acción de confirmación posterior a la transacción.
Al mirar:
void commit(TransactionStatus status) throws TransactionException;
No puedo ver cómo puedo determinar que una transacción fue exitosa, aparte de asumirla, por lo que si no se arroja una excepción.
Y podría usar AOP como una opción, pero ¿qué hay de hacerlo programáticamente, tal vez usando el método de devolución de llamada?
Gracias a la respuesta de Grooveek y al comentario de Alex debajo de esto, lo puse aquí porque las sugerencias combinadas proporcionan una solución sólida y más limpia que es difícil de encontrar en la red.
Utilizando Spring 4+. Si necesita una devolución de llamada en un método @Transactional
después de que se realice correctamente, simplemente agregue eso al principio del 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();
}
}
Puede obtener exactamente lo que desea de una forma más sencilla, con TransactionSynchronizationManager
y TransactionSynchronization
Con TransactionSynchronizationManager
, tiene métodos estáticos para obtener información sobre la transacción actual y puede registrar una TransactionSynchronization
que le permite realizar automáticamente una confirmación posterior al llamar a eso
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
void afterCommit(){
//do what you want to do after commit
}
})
Tenga en cuenta que la sincronización TransactionSynchronization se realiza por subproceso (lo que a menudo no es un problema para una solicitud web básica).