我是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
的完成?
当您使用Propagation.REQUIRES_NEW
时,您告诉持久性提供程序启动所谓的嵌套事务。 Oracle文档对此主题有一些很好的解释:
所以,没有A不需要等待B提交,实际上可以回滚,A仍然可以提交。