在Spring中使用事务时创建一个post提交
由于某些原因,我已经手动执行了事务提交并使用Spring PlatformTransactionManager回滚,我需要做的是设置一个钩子,以便在提交事务后进行事后提交操作。
通过观察:
void commit(TransactionStatus status) throws TransactionException;
我不知道如何确定一个事务是成功的,除了假设它,所以如果不抛出任何expception。
我可以使用AOP作为一个选项,但是程序化做什么呢,也许使用回调方法?
您可以通过TransactionSynchronizationManager
和TransactionSynchronization
以更简单的方式获得您想要的内容
使用TransactionSynchronizationManager
,您可以使用静态方法获取有关当前事务的信息,并且可以注册TransactionSynchronization
允许您在调用时自动执行提交后
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){ void afterCommit(){ //do what you want to do after commit } })
请注意,TransactionSynchronization基于每个线程(对于基本Web请求通常不是问题)。
感谢Grooveek的回答以及Alex在其下的评论 – 我把它放在这里,因为合并后的建议提供了一个在网络上很难找到的可靠而简洁的解决方案。
使用Spring 4+。 如果在成功提交后需要对@Transactional
方法进行回调,只需在方法的开头添加:
@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(); } }
在我的一个项目中,由于某些原因,我还必须使用PlatformTransactionManager
。 所以我被迫使用org.springframework.transaction.support.TransactionTemplate
。
主要的好处是,如果您已正确实现PlatformTransactionManager,则无需为手动提交/回滚而烦恼。 如果您需要更具体的东西,至少TransactionTemplate的源代码可以帮助您。
这很简单:
config.xml中
MyServiceImpl.java
@服务 公共类MyServiceImpl实现MyService { @Autowired private TransactionTemplate transactionTemplate; public Entity getSomethingWithTx(final long id){ return transactionTemplate.execute(new TransactionCallback(){ @覆盖 public Entity doInTransaction(TransactionStatus status){ // TODO工具 } }); }