Spring事务银行转账示例

https://www.imooc.com/video/9331

声明式事务

@Transactiona()

编程式事务

  • 非模板式(不使用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,一条订单一条支付记录挺好。但是由于上述的非幂等,就需要增加一个订单流水表(订单号,流水号),来解决客户重复点击支付的问题。

原文地址:https://www.cnblogs.com/rgqancy/p/8757107.html