spring中如何配置最外层方法事务不回滚,而外部调用的其他方法事务回滚呢?

时间:2022-09-12 21:25:59
事务配置如下。 
<bean id="payHibernateTransProxy" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
<property name="transactionManager"> 
<ref bean="hibernateTransManager" /> 
</property> 
<property name="transactionAttributes"> 
<props> 
<prop key = "uploadPayVoucherBillBySmallTrans">PROPAGATION_NOT_SUPPORTED </prop> 
<prop key = "uploadPayVoucherBill">PROPAGATION_REQUIRED </prop> 

<prop key="*">PROPAGATION_REQUIRED,-Exception </prop> 
</props> 
</property>、 

代码如下: 


public String uploadPayVoucherBillBySmallTrans(List list,HeadInfo info,CurrentUser user,boolean isWorkflow){
   int sucess = 0;
   int failture = 0;
   List oneList = null;
   setImportPayBillVoucher(list, user, "voucher_bill_id");
   for (int i =0,n=list.size();i<n;i++){
    oneList = new ArrayList();
    oneList.add(list.get(i));
    try {
     uploadPayVoucherBill(oneList,info,user,isWorkflow);
    }catch (Exception e){
     e.printStackTrace();
     failture ++;
    }
    
   }
     sucess = list.size() - failture;
     return "共上传文件"+list.size()+"条,成功"+sucess+"条";
}
public String uploadPayVoucherBill(List list, HeadInfo info, CurrentUser user, boolean isWorkflow) {
String result = "";
try {

// setImportPayBillVoucher(list, user, "voucher_bill_id");
baseBusiness.doWorkFlow(user, "", list, false, false);
writeExportDate(list, user);
payVoucherBillDAO.batchUpdate(list);
if( true ){
throw new BaseException( "test" );
}
result = exchangeDtoXml.uploadFiles(list, info, user);
} catch (Exception e) {
throw new PlatformException(e.getMessage());
}
return result;
}


uploadPayVoucherBillBySmallTrans会调用uploadPayVoucherBill方法,我希望如果有异常uploadPayVoucherBill方法回滚,而uploadPayVoucherBillBySmallTrans方法不回滚,
而现在是在uploadPayVoucherBillBySmallTrans方法中必须重新抛出异常之后才回滚,不知道配置有什么错误,请大侠指点。

9 个解决方案

#1


savePoint 保存点

一般情况下,事务的完整性要求,要不全部提交,要不全部回滚,不能部分。
所以产生了保存点这个概念和对应的功能。你可以回滚到已经保存的某个保存点。

#2


我的意思是uploadPayVoucherBill是一个完整的事务,而uploadPayVoucherBillBySmallTrans是没有事务的,这是我想达到的目的,对于uploadPayVoucherBillBySmallTrans而言,它是完整的。

#3


个人理解:
uploadPayVoucherBillBySmallTrans中调用uploadPayVoucherBill,已经catch异常了,所以应该不会rollback
或者
<prop key = "uploadPayVoucherBillBySmallTrans">PROPAGATION_NOT_SUPPORTED </prop> 
<prop key = "uploadPayVoucherBill">PROPAGATION_REQUIRED </prop> 

<prop key="*">PROPAGATION_REQUIRED,-Exception </prop>
spring配置中不匹配uploadPayVoucherBillBySmallTrans,应该也不会rollback

#4


有什么可以解决的方法吗?

#5


<prop key = "uploadPayVoucherBillBySmallTrans">PROPAGATION_NOT_SUPPORTED </prop> 
<prop key = "uploadPayVoucherBill">PROPAGATION_REQUIRED </prop> 
<prop key="*">PROPAGATION_REQUIRED,-Exception </prop> 

删除第一条和第三条试试

#6


受一楼启发,把事务配置成了嵌套事务
<prop key = "uploadPayVoucherBill"> PROPAGATION_NESTED,-Exception</prop>
同时把nestedTransactionAllowed也配置为了true
<bean id="hibernateTransManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mysessionFactory" />
</property>
<property name="nestedTransactionAllowed" value="true" /> 

</bean>

不知道为啥还是事务不回滚,大家用过 PROPAGATION_NESTED这种事务的给个意见,谢谢。

#7


有人会不 在线等待 急!

#8


<prop key="*">PROPAGATION_REQUIRED,-Exception </prop> 
所有的方法都加事务,性能太差了吧,

我建议你这么配<prop key="do*">PROPAGATION_REQUIRED,-Exception </prop> 
所有以do开头的方法有事务,其他的无事务,

另外我支持fosjos
lz在处理事务的时候还是要综合考虑比较好,否则事务都乱套了,我觉得你的需求很常见,一般大家都是像我说的那样配置的,所有方法都带事务这个可不好,以后问题会越来越多.

#9


问题解决了,因为在我配置的是同一个事务中的两个方法的,这样不会起另一个事务,查看了spring的源代码。

#1


savePoint 保存点

一般情况下,事务的完整性要求,要不全部提交,要不全部回滚,不能部分。
所以产生了保存点这个概念和对应的功能。你可以回滚到已经保存的某个保存点。

#2


我的意思是uploadPayVoucherBill是一个完整的事务,而uploadPayVoucherBillBySmallTrans是没有事务的,这是我想达到的目的,对于uploadPayVoucherBillBySmallTrans而言,它是完整的。

#3


个人理解:
uploadPayVoucherBillBySmallTrans中调用uploadPayVoucherBill,已经catch异常了,所以应该不会rollback
或者
<prop key = "uploadPayVoucherBillBySmallTrans">PROPAGATION_NOT_SUPPORTED </prop> 
<prop key = "uploadPayVoucherBill">PROPAGATION_REQUIRED </prop> 

<prop key="*">PROPAGATION_REQUIRED,-Exception </prop>
spring配置中不匹配uploadPayVoucherBillBySmallTrans,应该也不会rollback

#4


有什么可以解决的方法吗?

#5


<prop key = "uploadPayVoucherBillBySmallTrans">PROPAGATION_NOT_SUPPORTED </prop> 
<prop key = "uploadPayVoucherBill">PROPAGATION_REQUIRED </prop> 
<prop key="*">PROPAGATION_REQUIRED,-Exception </prop> 

删除第一条和第三条试试

#6


受一楼启发,把事务配置成了嵌套事务
<prop key = "uploadPayVoucherBill"> PROPAGATION_NESTED,-Exception</prop>
同时把nestedTransactionAllowed也配置为了true
<bean id="hibernateTransManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mysessionFactory" />
</property>
<property name="nestedTransactionAllowed" value="true" /> 

</bean>

不知道为啥还是事务不回滚,大家用过 PROPAGATION_NESTED这种事务的给个意见,谢谢。

#7


有人会不 在线等待 急!

#8


<prop key="*">PROPAGATION_REQUIRED,-Exception </prop> 
所有的方法都加事务,性能太差了吧,

我建议你这么配<prop key="do*">PROPAGATION_REQUIRED,-Exception </prop> 
所有以do开头的方法有事务,其他的无事务,

另外我支持fosjos
lz在处理事务的时候还是要综合考虑比较好,否则事务都乱套了,我觉得你的需求很常见,一般大家都是像我说的那样配置的,所有方法都带事务这个可不好,以后问题会越来越多.

#9


问题解决了,因为在我配置的是同一个事务中的两个方法的,这样不会起另一个事务,查看了spring的源代码。