Spring事務銀行轉賬示例
阿新 • • 發佈:2018-04-09
參數 exe 水表 包含 strong 客戶 pub 註入 可能
https://www.imooc.com/video/9331
聲明式事務
撒打算
編程式事務
-
非模板式(不使用TransactionTemplate)
http://cailangwei.blog.163.com/blog/static/1314585792014895755400/
applicationContext.xml:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource"/>
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx.getBean("transactionManager"); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔離級別,開啟新事務 TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務狀態 try { //邏輯代碼 transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); }
-
模板式(使用TransactionTemplate)
spring為了簡化手動事務編程,提供了TransactionTemplate這個輔助類,把一些常用邏輯用泛型參數配合方法提供出來。
https://blog.csdn.net/wang0928007/article/details/7576591
https://blog.csdn.net/daijin888888/article/details/51822257
http://wzhw2008.iteye.com/blog/1687523
編程式註入模板:PaymentServiceImpl.java
// 註入事務管理的模板 @Autowired private TransactionTemplate transactionTemplate;
配置式註入模板:
<!-- 配置業務層類 --> <bean id="accountService" class="com.zs.spring.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao" /> <!-- 註入事務管理的模板 --> <property name="transactionTemplate" ref="transactionTemplate" /> </bean>
使用模板包裹業務邏輯
Object result = transactionTemplate.execute(new TransactionCallback(){ @Override public Object doInTransaction(TransactionStatus status) { // TODO 編寫支付業務邏輯 return 1; } });
銀行轉賬(包含支付寶、微信的接口)
調用對方的接口,對方的接口設計可能並非冪等的:
我方系統的order表本來與對應對方系統order,一條訂單一條支付記錄挺好。但是由於上述的非冪等,就需要增加一個訂單流水表(訂單號,流水號),來解決客戶重復點擊支付的問題。
Spring事務銀行轉賬示例