usage transaction example driven data annotation java spring transactions

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 .

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

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).