【问题标题】:What are the advantages of using timeout property in Spring framework?在 Spring 框架中使用 timeout 属性有什么好处?
【发布时间】:2020-07-13 13:34:11
【问题描述】:

当我阅读this 关于事务的教程时,我注意到timeout 属性,这是我以前从未在我开发的任何 REST 服务中使用过的。

例如,在这段代码中:

@Service
@Transactional(
  isolation = Isolation.READ_COMMITTED, 
  propagation = Propagation.SUPPORTS, 
  readOnly = false, 
  timeout = 30)
public class CarService {
 
    @Autowired
    private CarRepository carRepository;
 
    @Transactional(
      rollbackFor = IllegalArgumentException.class, 
      noRollbackFor = EntityExistsException.class,
      rollbackForClassName = "IllegalArgumentException", 
      noRollbackForClassName = "EntityExistsException")
    public Car save(Car car) {
        return carRepository.save(car);
    }
}

使用timeout 属性有什么好处或优势?使用它是一个好习惯吗?谁能告诉我超时属性的用例吗?

【问题讨论】:

    标签: spring-boot timeout jta


    【解决方案1】:

    正如Spring Docs 解释:

    Timeout 使客户端能够控制事务在超时之前运行多长时间并由 底层交易基础设施。

    因此,好处显而易见 - 控制事务(及其下的查询)可能持续多长时间,直到它们回滚。

    问:为什么控制交易时间有用/好?

    答:如果您故意希望您的交易不会花费太长时间 - 现在是使用此配置的好时机;如果您预计您的事务可能需要比其default 的最大时间更长的时间,那么提供此配置非常有帮助。

    【讨论】:

    • 嗨@Giorgi Tsiklauri,如果好处是显而易见的,为什么在现实世界的项目中使用超时是非常罕见的
    • 因为它是AOP控制和管理的又一个属性。如果您确定,您的交易不太可能需要很长时间,或者!如果您故意希望您的交易不会花费太长时间 - 现在是使用此配置的好时机。
    • 您能否解释一下“AOP 控制和管理的另一个属性”
    • 我已经更新了我的答案。请看一下.. @Transactional 由 AOP 设施管理和处理。如果你现在不明白,在这里解释一切有点困难。但是,我想我提供了足够的信息来了解为什么使用它可能是好是坏。
    【解决方案2】:
    1. 一个是阻止记录被长时间锁定而无法服务任何其他请求。

    2. 假设您正在预订机票。在最终提交页面上,它说了这么久,您的用户会永远等待吗?所以你设置了http客户端超时。但是现在您的 http 客户端超时了,如果您没有事务超时会发生什么?您向用户显示错误说它没有成功,但您的事务需要时间,因为它没有任何超时并且在您的 http 客户端超时后提交。

    【讨论】:

    • 谢谢,是否添加超时属性是个好主意?
    • 是的。添加它是个好主意。但它不应该太短或太长,决定将是困难的部分。您可以对此进行研究。
    【解决方案3】:

    以上所有答案都是正确的,但需要注意的是:

    此属性专为Propagation.REQUIRED 使用而设计 或Propagation.REQUIRES_NEW 因为它只适用于新开始 交易。

    如文档所述。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2013-11-05
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多