【排坑】内外部事务的回滚问题(三)

【前提】:嵌套事务。事务doProcess方法的中调用事务update方法,且可以捕获update方法中抛出的异常,问:doProcess方法既然可以捕获异常,那还会发生回滚操作么?

【代码】:

@Service
public class TestReqJsonProcess implements JsonProcessInterface {
	private Logger logger = LoggerFactory.getLogger( getClass() );

	@PersistenceContext
	private EntityManager em;

	@Autowired
	private ServJsonUtil servDocUtil;
	
	@Autowired
	private BusiOptUtil busiOptUtil;
	
	@Autowired
	private RTmAppMain rTmAppMain;
	
    @Transactional
	public ServiceDoc doProcess( ServiceDoc servReq ) throws ProcessException {
		logger.debug("--------------执行开始-外部事务--------------");
		try {
			TestReqRequest request = new TestReqRequest();
			servDocUtil.setBeanProperty( servReq, request );
			
			String appNo = request.getAppNo();
			String remark = request.getRemark();
			
			QTmAppMain qTmAppMain = QTmAppMain.tmAppMain;
			TmAppMain tmAppMain = new JPAQuery( em ).from( qTmAppMain )
					.where( qTmAppMain.appNo.eq( appNo ) )
					.singleResult( qTmAppMain );
			
			tmAppMain.setRemark(remark);

			rTmAppMain.save(tmAppMain);
			
			logger.debug("外部事务保存对象完成!");
			
			busiOptUtil.update(appNo, remark);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.debug("--------------执行结束-外部事务--------------");
		return servReq;
	}
}
@Component
public class BusiOptUtil {

	Logger logger = LoggerFactory.getLogger( this.getClass() );

	@PersistenceContext                              
	private EntityManager em;

	@Autowired
	private RTmAppMain rTmAppMain;

	@Autowired
	private RTmAppPrimApplicantInfo rTmAppPrimApplicantInfo;

	@Transactional
	public void update(String appNo, String remark){
		QTmAppPrimApplicantInfo qTmAppPrimApplicantInfo = QTmAppPrimApplicantInfo.tmAppPrimApplicantInfo;
		TmAppPrimApplicantInfo info = new JPAQuery( em ).from( qTmAppPrimApplicantInfo ).where( 
				qTmAppPrimApplicantInfo.appNo.eq( appNo ))
				.singleResult( qTmAppPrimApplicantInfo );
		info.setCarUse(remark);
		rTmAppPrimApplicantInfo.save(info);

		logger.dubug("内部事务保存对象完成");

		logger.dubug("执行完了作一下"+1/0);
	}
}

【结果】:运行后发现update回滚,同时doProcess方法也发生了回滚。

【分析】:

1.外部起事务,内部起事务,内外都有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。

2.外部起事务,内部起事务,当内部没有Try Catch
内部出错:内部和外部事务都回滚。
外部出错:内部和外部事务都不回滚。

3.外部起事务,内部不起事务,内外都有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。

4.外部起事务,内部不起事务,当内部没有Try Catch
内部出错:内部和外部事务都不回滚。
外部出错:内部和外部事务都不回滚。

5.外部不起事务,内部起事务,内外都有Try Catch
内部出错:内部不回滚,外部非事务。
外部出错:内部不回滚,外部非事务。

6.外部不起事务,内部起事务,当内部没有Try Catch
内部出错:内部回滚,外部事务不回滚。
外部出错:内部不回滚,外部非事务。

转载于:https://my.oschina.net/xiaohai945/blog/1795144

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值