Spring @Transactional超时没有超时

时间:2017-11-25 18:02:11

标签: spring spring-transactions

我在我的应用程序中将事务超时设置为@Transactional(propagation = Propagation.REQUIRED,timeout = 30)

ActiveMQXAConnectionFactory和Oracle XA Datasource是我的Distributed事务的两个资源。从队列中读取消息后,我的事务开始,处理应用程序的时间超过30秒,但事务仍未超时。只有在提交事务时才会抛出超时异常。我希望在30秒后,事务应该超时并抛出异常并使该线程可用于从队列中消耗另一条消息。这可能吗?

1 个答案:

答案 0 :(得分:0)

如果没有看到您的配置,就很难说。如果您只是添加@Transactional,则不会执行任何操作。您将需要EntityManagerTransactionManager,然后您需要打开基于注释的事务管理,如果我没记错,Spring需要控制您的数据源。

另一个,可能是不必要的旁注,@ Transaction仅适用于公共方法。 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还是vanilla Spring?如果你泄露它,我们可能会给你更多的方向。

希望这有点帮助!