@Transactional方法调用,而不@Transactional anotation另一种方法

2019-05-13 09:09发布

我已经看到了在被标记为服务类中的方法@Transactional ,但也有人呼吁在未标记为同一类的其他一些方法@Transactional

这是否意味着调用不同的方法使应用程序打开单独连接到数据库或暂停父事务,等等?

什么是对的方法,而不接触用另一种方法叫任何注释的默认行为@Transactional注解?

Answer 1:

当你调用一个方法,无需@Transactional一个事务块内,父事务将继续新的方法。 它将使用从父方法(具有相同的连接@Transactional )和引起了被调用的方法的任何异常(不@Transactional将导致事务回滚如在交易定义中配置。

如果你调用一个方法@Transactional从法注解@Transactional同一实例内,则称为方法事务行为不会对交易产生任何影响。 但是,如果调用从一个事务定义的其他方法的事务定义的方法,以及它们在不同的情况下,那么在调用方法的代码将遵循调用的方法给出的交易的定义。

你可以找到的部分声明式事务管理的详细信息Spring的事务文档 。

Spring声明式事务模型使用AOP代理。 所以AOP代理负责创建交易。 AOP代理将被激活只有在实例与方法都是从出方称为实例。



Answer 2:

  • 这是否意味着调用不同的方法使应用程序打开单独连接到数据库或暂停父事务,等等?

这取决于传播水平 。 这里是所有可能的水平值 。

例如,在案件的传播级别嵌套当前事务会“暂停”和一个新的事务将被创建( 注:实际嵌套事务的创作只会在特定的事务管理工作

  • 什么是对的方法,而不由与@Transactional注释的另一种方法叫任何注释的默认行为?

默认传播级别(你所说的“行为”)是REQUIRED 。 在情况下,“内”方法被调用,其具有@Transactional在其上的注释(或经由XML声明交易),它会在同一事务中执行,例如,“没有什么新”被创建。



Answer 3:

@Transactional马克事务边界(开始/结束),但是交易本身被绑定到线程。 一旦一个事务开始其传播穿过方法调用,直到原始方法返回和事务提交/回滚。

如果另一个方法被称为具有@Transactional注解然后传播取决于注释的传播属性。



Answer 4:

你可能已经猜到了答案,从上述回复您的问题。 内方法将影响外方法如果内方法不与@Transactional注释。

在壳内方法也标注有@Transactional与REQUIRES_NEW ,下面会发生。

...
@Autowired
private TestDAO testDAO;

@Autowired
private SomeBean someBean;

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
  testDAO.insertUser(user);
  try{
    someBean.innerMethod();
  } catch(RuntimeException e){
    // handle exception
  }
}


@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
  throw new RuntimeException("Rollback this transaction!");
}

内部方法标注有REQUIRES_NEW和抛出RuntimeException所以它会设置其事务回滚,但不会影响外部事务。 当内部事务处理启动,然后恢复后的内成交的外部事务已暂停。 它们彼此独立运行,所以外部事务可能成功提交。



文章来源: @Transactional method calling another method without @Transactional anotation?