弹簧@Transactional超时没有超时
问题描述:
我已经设置事务超时在我的应用程序作为@Transactional(传播= Propagation.REQUIRED,超时= 30)弹簧@Transactional超时没有超时
ActiveMQXAConnectionFactory和Oracle XA数据源是我的分布式事务的两个资源。在从队列中读取消息之后,我的事务开始,并且在处理应用程序的时间超过30秒并且事务没有超时。只有在提交事务时抛出超时异常。我想在30秒后立即让事务超时并抛出异常,并使该线程可用来从队列中消耗另一条消息。这可能吗?
答
没有看到你的配置,这将是很难说。如果您只是添加@Transactional
,则不会执行任何操作。你将需要一个EntityManager
和一个TransactionManager
,那么你需要打开基于注释的事务管理,如果我正确记得,Spring需要控制你的数据源。
另一个可能是不必要的方面说明,@Transactional只能用于公共方法。 Spring会代理你的方法来管理事务,Spring只能代理公共方法。另外,如果你从同一个类中的另一个方法调用该方法,那么它将只能够处理来自另一个类的调用,Spring不能代理,因此也没有事务管理。春天在这里是偷偷摸摸的。
@Service
public class A{
@Autowired
Datasource datasource;
@Transactional
public void save(){
datasource.doStuff();
}
public void callSave(){
save();
}
}
@Service
public class B{
@Autowired
A a;
public void callSave(){
a.save();
}
}
在这里,如果a.save()
从a.callSave()
叫,不会发生任何代理,因此你不会有任何事务管理。但是在完全相同的应用程序中,如果您调用b.callSave()
,则您将拥有事务管理,因为Spring可以将方法调用代理为a.save()
。
您是使用Spring Boot还是香草泉?如果你透露,我们可以给你更多的方向。
希望有一点帮助!