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

  • 相关阅读:
    如何在CentOS 7中安装最新Git(源码安装)
    centos7安装Lua
    syslog-ng 学习
    syslog-ng内容讲解
    java框架篇---spring IOC 实现原理
    java 过滤器filter使用案例
    jsp-TagLib标签库
    阿里服务器+Centos7.4+Tomcat+JDK部署
    IntelliJ IDEA上创建maven Spring MVC项目
    ServiceStack.Redis之IRedisClient
  • 原文地址:https://www.cnblogs.com/lyhero11/p/4071385.html
Copyright © 2020-2023  润新知