spring 事务提交成功后,再去发送事件

TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronizationAdapter() {
      @Override
      public void afterCommit()
      {
        applicationContext.publishEvent( event );// 发送事件
      }
    } );

PS:

spring 在发送事务(applicationContext.publishEvent( event );)和@EventListener本来是拥有一个事务,

但是, 我们在保证事务执行成功之后再去接受事务,导致没有in progress的事务。所以如果需要在@EventListener端再去提交事务(保存数据),需要在方法上加上@Transactional(propagation=Propagation.REQUIRES_NEW)。

如果需要手动开启事务,可以使用Spring的PlatformTransactionManager 接口,

@Autowired
private PlatformTransactionManager transactionManager;
try{
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior( TransactionDefinition.PROPAGATION_REQUIRES_NEW );// 事务隔离级别,开启新事务
    TransactionStatus status = transactionManager.getTransaction( def );//获取事务状态,并开启事务,相当于transation.begin(); 
	saveMethod();// 逻辑保存数据的代码 
	transactionManager.commit( status ); //提交事务
}
catch(Exception e)
{ 
	transactionManager.rollback( status ); // 事务回滚
}

本人java初级,如果有人看到,欢迎补充,欢迎拍砖。


猜你喜欢

转载自blog.csdn.net/wessiyear/article/details/80017967