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方法。

  • 相关阅读:
    【模板】高斯消元
    【洛谷P1730】最小密度路径
    【模板】矩阵乘法优化线性递推
    【洛谷P3723】礼物
    【洛谷P3338】力
    【模板】NTT
    【洛谷P1919】A*B Problem升级版
    测试理论基础(思维导图)
    Fiddler
    常用 Linux 命令
  • 原文地址:https://www.cnblogs.com/lyhero11/p/4071385.html
Copyright © 2011-2022 走看看