spring 動態代理事務 與 expose-proxy="true" , 事務控制

好比有一個要求, .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;
		}
相關文章
相關標籤/搜索