【问题标题】:Spring @Transactional anotation questionsSpring @Transactional 注解问题
【发布时间】:2014-02-24 23:36:27
【问题描述】:

我有两个方法都标注为@Transactional,并且都执行一些数据库操作,主要是插入。

我从methodA调用methodB

@Transactional
public void methodA(){
methodB();

// Some database Operations

// some error conditions....
throw exception;
}

@Transactional
public void methodB(){
// Some database Operations
}

所以我只想在所有操作都成功的情况下提交 MethodA 和 MethodB 的数据库事务。 因此,即使在 methodA 中遇到异常,在 methodB 中所做的更改仍然会被提交。

如果methodA遇到错误,我希望MethodB的更改回滚。

我需要做点别的吗?

【问题讨论】:

  • 从您的帖子中并不清楚methodA() 和methodB() 的本质是什么,但我想有人会提到@Transactional 注释最适合a 中的类的方法服务层——你让我怀疑你的意思是这些是关于数据库操作的那些 cmets 的服务层方法。但是,当然,服务层会间接对数据库进行操作,所以也许这就是您的意图。

标签: java spring hibernate


【解决方案1】:

methodA() 中调用的所有方法都是事务性的,如@Transactional annotation has a propagation of required by default。所以methodB() 中的@Transactional 并不是完全需要的。

【讨论】:

    【解决方案2】:

    当从methodA调用methodB时,它不会创建新事务,因为您没有调用整理所有事务创建和回滚的spring代理,因此methodA和methodB的插入将在同一个事务中执行。

    所以不,你不需要做任何其他事情......

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 2019-02-18
      • 2014-12-24
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2014-07-18
      • 2018-03-28
      • 2015-05-15
      相关资源
      最近更新 更多