【问题标题】:Call a transactional function of Required propagation twice results in only 1 transaction ( but 2 transactions when calling from another class)调用所需传播的事务函数两次只导致 1 个事务(但从另一个类调用时为 2 个事务)
【发布时间】:2019-10-27 06:55:36
【问题描述】:

我有一个服务类,其方法 doSomething() 用 @transactional 注释,传播类型为“必需”。 另一个非事务类调用 doSomething() 两次。

我假设将为每个调用创建 2 个事务,但结果证明这两个调用只使用相同的事务。 为了进一步混淆我,我使用另一个 @RestController 非事务类调用了两次 doSomething()。但这次结果证明每次调用都使用不同的事务。

我有 2 个问题。

预期的行为是什么(1 或 2 笔交易)

为什么会有不同?

NormalClass{
   @Autowired
   Service service;

   service.doSomething();
   // same transaction used
   service.doSomething(); 
}

RestController{
   @Autowired
   Service service;

   service.doSomething();
   // new transaction used
   service.doSomething();
}

Service{
   @Transactional
   doSomething(){};
}

【问题讨论】:

  • 我可以看出的一个区别是,第一类使用的是 Hibernate Transaction 管理器,而其余控制器使用的是 JTA 管理器,但我怀疑这就是区别所在?
  • 如果第一种情况确实有一个tx,那么在已经存在的事务中调用普通类方法。

标签: java spring transactions


【解决方案1】:

感谢@JB Nizet,你说得对,有一个由 NormalClass 扩展的抽象类已经获得了事务。我没想到抽象类会这样做。

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多