弹簧@Transactional超时没有超时

弹簧@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还是香草泉?如果你透露,我们可以给你更多的方向。

希望有一点帮助!