spring 动态代理事务 与 expose-proxy="true" , 事务控制

比如有一个要求, 

两个service 方法A,B 

B方法里面调用了 B方法, 需要B方法 抛异常时候可以事务回滚,而A不影响A方法的 事务提交

比如

6e94661dfe49d74f9335d4d2b6e2ed485bb.jpg

 

以上的做法是不对的。

 

可以参考 

https://blog.csdn.net/JustForSS/article/details/83008824

或者

https://mp.weixin.qq.com/s/vCZP8sPrtnXWvg6IlcHQOg

 

即 使用 expose-proxy="true" 去解决。

或者 使用 通过ApplicationContext上下文进行解决 

 

之前我不知道还可以这样简单解决,配置一些或者 通过 ApplicationContext 获取 AOP代理对象去 调用方法。

 

我的解决方式就比较麻烦,就是 

手动 提交事务,如果没有异常, 如果有异常就手动 执行回滚.

 

比如:

//注入事务管理bean
@Resource(name = "transactionManager")
	private HibernateTransactionManager transactionManager;



// 将充值状态先保存, 防止下面出现异常回滚掉充值记录
		DefaultTransactionDefinition defr = new DefaultTransactionDefinition();
		defr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
		
		// 设置为可以嵌套事务,默认为不可以开启嵌套事务
		TransactionStatus statusr = transactionManager.getTransaction(defr); // 获得事务状态

		try {
			// 记录充值前数据
			Recharge recharge = new Recharge();
			recharge.setReAccount(BigDecimal.ZERO);
			// 以元为单位
			recharge.setRechargeAmount(new BigDecimal(tranAmt));
			recharge.setStatus(Recharge.STATUS_UNDO);
			recharge.setUserbasicsinfo(user);
			recharge.setRechargetype(Recharge.RECHARGE_TYPE_PERSON);// 个人网银
			recharge.setRechargeWay(Recharge.RECHARGE_WAY_SHORTCUTPAY);
			recharge.setTime(DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
			recharge.setOrderNum(reqNo);// 订单号就是 交易批次号
			rechargesService.rechargeSave(recharge);

			transactionManager.commit(statusr);

		} catch (Exception e) {
			transactionManager.rollback(statusr);
			LOG.error("通联充值接口调用保存异常", e);
			e.printStackTrace();
			// 出现了异常,将 异常抛出去,不执行下面的业务了
			throw e;
		}



		// 自定义事务控制,达到 之后的业务出现了异常这个充值里面的记录不会回滚
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
		// 事物隔离级别,开启新事务
		TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
		// 充值
		AllinpayResult result = null;
		try {
			result = allinpayTranxManager.singleTranxIncome(
					user.getUserrelationinfo().getPlainCardId().toUpperCase(), userBank.getAccountUserName(),
					userBank.getPlainBankAccount(), tranAmtDecimal, userBank.getPlainMobile(),
					userBank.getBanktype().getPayCode(),
					reqNo);
			// 将充值记录 事务手动提交
			transactionManager.commit(status);
		} catch (Exception e) {
			// 手动回滚
			transactionManager.rollback(status);
			LOG.error("通联充值接口调用异常", e);
			e.printStackTrace();
			// 出现了异常,将 异常抛出去,不执行下面的业务了
			throw e;
		}


 

 

 

 

转载于:https://my.oschina.net/ouminzy/blog/3072752

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值