比如有一个要求,
两个service 方法A,B
B方法里面调用了 B方法, 需要B方法 抛异常时候可以事务回滚,而A不影响A方法的 事务提交
比如
以上的做法是不对的。
可以参考
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;
}