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

问题描述 投票:1回答:1

我是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)将暂停外部交易,但暂停的意义究竟是什么意思?它有超时吗?

如果我不通过DOsclassB,相反,我做

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

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

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

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

java spring hibernate spring-transactions propagation
1个回答
0
投票

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

  1. 暂停是什么意思? 虽然嵌套(子)事务处于活动状态,但父事务可能不会执行除提交或中止之外的任何操作,也不会创建更多子事务。
  2. 交易A的承诺与交易B的运行结果之间是否有任何关系? 提交嵌套事务不会影响父事务的状态。父事务仍未提交。但是,父事务现在可以看到子事务所做的任何修改。当然,在父母也提交之前,这些修改仍然对所有其他事务都是隐藏的。
  3. 换句话说,交易A的承诺是否需要等待方法B1的完成? 如果父事务在具有活动子项时提交或中止,则子事务的解析方式与父事务相同。也就是说,如果父节点中止,那么子事务也会中止。如果父提交,则还提交子事务已执行的任何修改。

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

© www.soinside.com 2019 - 2024. All rights reserved.