【问题标题】:Alter Hibernate transaction timeout for only one method?仅针对一种方法更改 Hibernate 事务超时?
【发布时间】:2021-12-06 05:24:29
【问题描述】:

有没有办法只为 Spring Boot 2 JPA 存储库中的一种方法更改 Hibernate default transaction timeout 值?我想为我的应用程序(其中包含 JPA 存储库和使用 Hibernate SessionFactory 的旧存储库)保留默认的 30 秒,但允许通常需要相当多的工作(EDIT: 在独立事务中进行)更多要运行。我想知道除了Transactions from rollbacking in certain situations之外,是否有办法指定特殊情况,就像你一样。

我正在寻找一种不需要创建与其他方法不同的 HibernateTransactionManager 的解决方案。

【问题讨论】:

  • 您只能在每个事务中执行此操作,因此如果该方法导致事务启动,您可以更改它。在该方法上添加注释应该是可行的 - 我会查看@Transactional(timeout = 30),如果你想始终在自己的事务中运行该方法,我会添加propagation = Propagation.REQUIRES_NEW
  • @Thomas 这会覆盖默认超时吗?
  • 是的,这专门用于覆盖默认超时。 JavaDoc 在这里应该有所帮助,我会再次指出这部分(我强调):“专为与 Propagation.REQUIRED 或 Propagation.REQUIRES_NEW 一起使用而设计,因为 它仅适用于新开始的事务。”
  • @Thomas 这是我问题的正确答案。您能否添加一个答案,以便我可以标记为已接受?

标签: java spring hibernate jpa transactions


【解决方案1】:

Spring 有一个 @Transactional 注释,用于标记应该在事务上下文中运行的方法(以及范围)。此注解有一个timeout 属性,可用于覆盖默认超时。

请注意,超时只能在事务级别设置,因此timeout 属性仅在注释导致启动新事务时使用。文档特别指出:“专为与 Propagation.REQUIRED 或 Propagation.REQUIRES_NEW 一起使用而设计,因为它仅适用于新开始的事务。”

Propagation.REQUIRED 只会在还没有活动的事务时启动一个新事务,所以如果你想确保设置了超时,你需要启动一个新事务,因此最好使用Propagation.REQUIRES_NEW

因此注释将是:@Transactional(timeout = 30, propagation = Propagation.REQUIRES_NEW)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2015-01-15
    • 2015-02-03
    • 2020-03-28
    • 2021-02-16
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多