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

原文地址:https://www.cnblogs.com/lyhero11/p/4071385.html