【问题标题】:Spring boot application stuck with Transaction requried_newSpring Boot 应用程序卡在 Transaction requried_new
【发布时间】:2021-07-10 21:02:49
【问题描述】:

我在 Spring Boot 应用程序中有一个调度程序,如果我在调度程序方法上使用 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) 那么它只适用于一个数据库会话,但如果我使用 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) 在 DAO 级别或服务类级别,基于数据的四个 DAO/服务将转到其中一个 DAO,它达到 maxConnection 限制 16,正如我们在数据库会话及其卡住/在 java 中无需进一步处理即可挂起。会有什么问题?

【问题讨论】:

  • "会是什么问题?" - "达到 maxConnection 限制 16"
  • 是的,它已达到 maxConnection 限制并且应用程序卡住而没有做任何事情。

标签: java spring spring-boot spring-data-jpa spring-data


【解决方案1】:

基本上,调度程序方法中的所有处理都应该在一个事务中进行管理,因此注释应该在它上面(第一种方法)。

如果您在服务/DAO 方法中添加此注释,那么对于在您内部调用的每个方法,都会创建一个新事务,这可以解释您所面临的问题。

最后不需要添加“rollbackFor = Exception.class”,因为这是默认行为。

【讨论】:

  • 感谢您的回复,是的,已删除回滚
【解决方案2】:

这实际上取决于您调用方法的方式。

我会要求你做的一个测试是:

schedule 方法中添加:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

然后,在 Service 方法中,这样:

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

这样,当服务方法结束时,它会提交事务,但还有另一个事务作用域在更高级别运行。

【讨论】:

  • 谢谢您,先生,根据您的建议,它只有两个会话,并且不再增加。它对我有用。
猜你喜欢
  • 2017-04-07
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2021-11-09
  • 2018-12-16
  • 2018-02-23
  • 2018-09-15
相关资源
最近更新 更多