好比有一個要求, .net
兩個service 方法A,B 代理
B方法裏面調用了 B方法, 須要B方法 拋異常時候能夠事務回滾,而A不影響A方法的 事務提交code
好比orm
以上的作法是不對的。對象
能夠參考 blog
https://blog.csdn.net/JustForSS/article/details/83008824接口
或者事務
https://mp.weixin.qq.com/s/vCZP8sPrtnXWvg6IlcHQOgci
即 使用 expose-proxy="true" 去解決。get
或者 使用 經過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; }