zoukankan      html  css  js  c++  java
  • Spring 开发第一步(四)Spring与JDBC事务

                 Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源、hibernate数据源、JPA数据源等等)。在此基础上使用各种对应的Template来提供各种事务操作的方法。JDBC对应的是org.springframework.jdbc.datasource.DataSourceTransactionManager和org.springframework.transaction.support.TransactionTemplate.

    在Spring容器中,datasource、manager、template的注入顺序应该是, datasource->manager->template->使用者(例如dao)

    相关配置和代码举例(来自于《spring in action 3rd》)

    <jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitter" resource-ref="true" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" 
                p:transactionManager-ref="transactionManager"/>
    <bean id="jdbcTemplateDao" class="com.spitter.test.JdbcTemplateDao"  
                p:dataSource-ref="dataSource" p:txTemplate-ref="transactionTemplate"/>

    以上配置与书上有些许不同,但道理是一样的,而且个人觉得上面的配置更能体现出注入顺序。

    private TransactionTemplate txTemplate;
        public void setTxTemplate(TransactionTemplate txTemplate){
            this.txTemplate = txTemplate;
        }
    
    public void saveCity(String code , String name){
            SimpleJdbcTemplate jdbc = getSimpleJdbcTemplate();
            jdbc.update("insert into ta_ds_test(city_code, city_name) values(?,?)", code,name);
        }
        public void saveCityInTransaction(final String code , final String name){
            txTemplate.execute(new TransactionCallback<Void>(){
                @Override
                public Void doInTransaction(TransactionStatus arg0) {
                    try{
                    saveCity(code,name);
                    }catch(RuntimeException e){
                        arg0.setRollbackOnly();
                        throw e;
                    }
                    return null;
                }
            });
        }
    TransactionCallback是一个interface,上面的execute方法传入了一个TransactionCallback的具体实现的实例,有点绕。
    实际上,这等同于:先定义一个类,该类实现了TransactionCallback接口,在其中override了doInTransaction()方法, 然后new 出来这个类的一个实例,再将这个实例传给exectue方法。

  • 相关阅读:
    周五笔记
    python2.0代码重构为3.0一日记
    小白使用Bert跑分类模型
    andrew ng 深度学习 网易云课堂课程
    andrew ng machine learning week9 异常检测和推荐系统
    解决端口占用问题
    postgresqlmysql删除数据表中字段的回车和换行
    echarts常用的属性修改
    后端返回文件流,用blog方式下载 type 值
    antD vue 遇到的一些问题处理
  • 原文地址:https://www.cnblogs.com/lyhero11/p/4071385.html
Copyright © 2011-2022 走看看