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

  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/lyhero11/p/4071385.html
Copyright © 2011-2022 走看看