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

Spring 开发第一步(四)Spring与JDBC事务的更多相关文章

  1. Spring 开发第一步(三)Spring与JDBC

    <spring in action 3rd>中的前面4章讲解的是Spring的核心,也就是DI/IOC和AOP .从第5章开始是Spring在企业开发中的各个方面的应用.其实作为笔者从事的 ...

  2. Spring 开发第一步

    经过今天上午的学习发现spring上手开发一个"hello world"真的非常简单. 开发环境搭建: 1.去spring官网下载spring-framework-3.2.11.R ...

  3. Spring 开发第一步(二)

    今天继续学习<Spring in action 3rd>并运行书中的例子,到了第4章aop,是加入一个作为切面的Audience类,将Performer的perform()方法作为切点来进 ...

  4. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

  5. 我的自定义框架 || 基于Spring Boot || 第一步

    今天在园子里面看到一位大神写的springboot做的框架,感觉挺不错,遂想起来自己还没有一个属于自己的框架,决定先将大神做好的拿过来,然后加入自己觉得需要的模块,不断完善 目前直接复制粘贴过来的,后 ...

  6. Spring入门第一课:Spring基础与配置Bean

    1.入门 Spring是简化java开发的一个框架,其中IoC和AOP是Spring的两个重要核心.由于Spring是非侵入性的,通过Ioc容器来管理bean的生命周期,还整合了许多其他的优秀框架,所 ...

  7. 一起来学spring Cloud | 第一章:spring Cloud 与Spring Boot

    目前大家都在说微服务,其实微服务不是一个名字,是一个架构的概念,大家现在使用的基于RPC框架(dubbo.thrift等)架构其实也能算作一种微服务架构. 目前越来越多的公司开始使用微服务架构,所以在 ...

  8. Andriod开发第一步-部署环境(搬运&&总结)

         第一步:安装JDK      第二步:配置Windows上JDK的变量环境      第三步:下载安装Eclipse      第四步:下载安装Android SDK 配置了JDK变量环境, ...

  9. Spring框架第一篇之Spring的第一个程序

    一.下载Spring的jar包 通过http://repo.spring.io/release/org/springframework/spring/地址下载最新的Spring的zip包,当然,如果你 ...

随机推荐

  1. 9-最短路径(dijkstra)

    参考博客:http://www.wutianqi.com/?p=1890 #include <iostream>using namespace std;#define  max 1< ...

  2. Navicat Premium11连接Oracle出现ORA-28547:connection to server failed

    环境描述:本地Oracle正常安装,中途没有出现任何异常.确保Oracle的主要服务都启动了.1.OracleServiceORCL2.OracleOraDb11g_home1TNSListener ...

  3. viewstamp replication: A new primary copy method to support highly-avaliable d

    为了提高服务能力或者服务稳定,往往需要把数据重复布署,也就是replication.重复带来的问题是,更新的时候会带来不一致.一种比较简单的方法是,在N台重复的机器里选一台作为主机,其他作备份,只能通 ...

  4. IETF

    一.简介 https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%B7%A5%E7%A8%8B%E4%BB%BB%E5%8A%A1%E ...

  5. Shell编程实例

    一.简介 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更 ...

  6. Vue.js 生命周期的应用

    生命周期示意图 值得注意的几个钩子函数 activated 类型:Function 详细: keep-alive 组件激活时调用. 该钩子在服务器端渲染期间不被调用. 参考: 构建组件 - keep- ...

  7. kendo ui treeview 标题太长时的自动换行

    添加以下CSS即可: div.k-treeview{white-space: normal;}

  8. 前端之JavaScript笔记4

    一 按键事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. 2018.08.16 洛谷P1471 方差(线段树)

    传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...

  10. 2018.07.17 后缀自动机模板(SAM)

    洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...