外部交易和内部交易之间有什么关系?

时间:2018-01-03 00:01:23

标签: java spring hibernate spring-transactions propagation

我是Hibernate的新手,当我使用交易时,我遇到了几个问题。以前,情况是

@Transactional
Class A {
  methodA1(){
    DOs = fetchDOsFromDB();
    methodA2(DOs);
  }
    methodA2(DOs){
    ClassB.methodB1(DOs);
  }
}

Class B{
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  methodB1(DOs){
    dealWithDOs();
  }
}
但是我发现当DO的数量巨大时,它会给连接关闭异常。所以我想知道是否根本原因是我将DO传递给方法B1,方法B1与A中的事务绑定,并且事务A不能提交很长时间。

所以这是第一个问题,我知道@Transactional(propagation = Propagation.REQUIRES_NEW)会使外部交易暂停,但暂停的意义究竟是什么意思?它有超时吗?

如果我没有将DOs传递给classB,相反,我会

methodA1(){
DOs = fetchDOsFromDB();
List<Integer> list = getIds(DOs);
methodA2(list);
}

methodA2(list){
 ClassB.methodB1(list);
}

这意味着我不依赖DOs,这会有帮助吗?

交易A的提交与交易B的运行结果之间是否存在任何关系?换句话说,事务A的提交是否需要等待methodB1

的完成

1 个答案:

答案 0 :(得分:0)

当您使用Propagation.REQUIRES_NEW时,您告诉持久性提供程序启动所谓的嵌套事务。 Oracle文档对此主题有一些很好的解释:

  1. 暂停是什么意思?

      

    当嵌套(子)事务处于活动状态时,父事务   可能不会执行除提交或中止之外的任何操作,或者   创造更多的儿童交易。

  2. 交易A的承诺与交易B的运行结果之间是否有任何关系?

      

    提交嵌套事务对状态没有影响   父交易。父事务仍未提交。   但是,父事务现在可以看到所做的任何修改   儿童交易。当然,这些修改仍然存在   隐藏到所有其他事务,直到父提交。

  3. 换句话说,交易A的承诺是否需要等待方法B1的完成?

      

    如果父事务处于活动状态时提交或中止   孩子们,孩子的交易都以同样的方式解决了   家长。也就是说,如果父节点中止,那么子事务   也流产了。如果父提交,则进行任何修改   由孩子执行的交易也被提交。

  4. 所以,没有A不需要等待B提交,实际上可以回滚,A仍然可以提交。