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

  • 相关阅读:
    阶段性总结(PHP-JSON)
    阶段性总结(PHP-Array函数)
    JavaScript异步加载的三种方式——async和defer、动态创建script
    event.target 和 event.currentTarget 的区别
    面试题:常用的http状态码
    JS变量重复声明以及忽略var 声明的问题及其背后的原理
    line-height:1.5和line-height:150%的区别
    Web前端性能优化——如何提高页面加载速度
    Promise和setTimeout执行顺序 面试题
    过目不忘JS正则表达式
  • 原文地址:https://www.cnblogs.com/rgqancy/p/8757107.html
Copyright © 2020-2023  润新知