我是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
?
答案 0 :(得分:0)
当您使用Propagation.REQUIRES_NEW
时,您告诉持久性提供程序启动所谓的嵌套事务。 Oracle文档对此主题有一些很好的解释:
暂停是什么意思?
当嵌套(子)事务处于活动状态时,父事务 可能不会执行除提交或中止之外的任何操作,或者 创造更多的儿童交易。
交易A的承诺与交易B的运行结果之间是否有任何关系?
提交嵌套事务对状态没有影响 父交易。父事务仍未提交。 但是,父事务现在可以看到所做的任何修改 儿童交易。当然,这些修改仍然存在 隐藏到所有其他事务,直到父提交。
换句话说,交易A的承诺是否需要等待方法B1的完成?
如果父事务处于活动状态时提交或中止 孩子们,孩子的交易都以同样的方式解决了 家长。也就是说,如果父节点中止,那么子事务 也流产了。如果父提交,则进行任何修改 由孩子执行的交易也被提交。
所以,没有A不需要等待B提交,实际上可以回滚,A仍然可以提交。