1. 程式人生 > >Spring事務銀行轉賬示例

Spring事務銀行轉賬示例

參數 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事務銀行轉賬示例