1.spring支持编程式事务管理和声明式事务管理。
  编程式事务管理:编程式事务管理使用TransactionTemplate或者直接使用最底层的PlatformTransactionManager。spring推荐使用TransactionTemplate.
  声明式事务管理:声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截。声明式事务管理优于编程式事务管理,不需要在代码中掺杂事务管理的代码,这正是spring提倡的非侵入式开发。
  声明式事务管理有两种常用的方式:
    1.基于tx和AOP名字空间的xml配置文件。
    2.基于@Transactional注解的方式(此方式更简单易用)。

2.基于注解的声明式事务管理配置:
  spring.xml配置:

...
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=""
...
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="datasource" ref="datasource">
</bean>
<tx:annotation-driven transaction-manager="txManager">

  MyBatis自动参与到spring的事务管理中,不需要额外的配置,只需要org.mybatis.spring.SqlSessionFactoerBean引用的数据源和DataSourceTransactionManager引用的数据源一致即可。

3.事务详解:
  隔离级别:
    在org.springframework.transaction.annotation.Isolation枚举中定义了五个表示隔离级别的值:

public enum Isolation{
DEFAULT(-1);
READ_UNCOMMITTED(1);
READ_COMMITTED(2);
REPEATABLE_READ(4);
SERIALIZABLE(4);
}

  DEFAULT:默认值。表示使用底层数据库默认的隔离级别。对大部分数据库而言,通常这个值就是READ_COMMITTED。
  READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的事务。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
  READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读(推荐)。
  REPEATABLE_READ:该隔离级别表示一个一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。                                             该级别可以防止脏读和不可重复读。
  SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读、幻读。但是会严重影响程序的性能。通过不会用到该级别。
传播行为:
  事务的传播行为是指:如果在开始当前事务之前,一个事务上下文已经存在,此时又若干选项可以指定一个事务性方法的执行行为。
  在org.springframework.transaction.annotatiopn.Propagation枚举中定义了6个传播行为值:

public enum Propagation{
REQUIRED(0);
SUPPORTS(1);
MANDATORY(2);
REQUIRES_NEW(3);
NOT_SUPPORTED(4);
NEVER(5);
NESTED(6);
}

  REQUIRED:如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。
  SUPPORTS:如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行。
  MANDATORY:如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。
  REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  NOT_SUPPORTED:以非事务的方式运行。如果当前存在事务,则把当前事务挂起。
  NEVER:以非事务的方式运行。如果当前存在事务,则抛出异常。
  NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果当前没有事务,则该值等价于REQUIRED。

4.spring事务回滚规则:
  默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚事务,而抛出checked异常不会导致事务回滚。

@Transactional注解:
该注解的属性:

 
     
属性  类型   描述
 value   String   可选的限定描述符,指定使用的事务管理器
 propagation   enum:Propagation  可选的事务传播行为设置
 isolation   enum:Isolation  可选的事务隔离级别设置
 readOnly   boolean   读写或只读事务,默认:读写
 timeout  int(in seconds granularity)   事务超时时间设置
 rollbackFor  Class对象数组  必须继承自Throwable 导致事务回滚的异常类数组
 rollbackForClassName   类名数组  必须继承自Throwable 导致事务回滚的异常类名字的数组
 noRollbackFor   Class对象数组  必须继承自Throwable 不会导致事务回滚的异常类数组
 noRollbackForClassName   类名数组  必须继承自Throwable 不会导致事务回滚的异常类名字的数组

用法:
  Transactional注解可以作用于接口、接口方法、类、类方法上。当作用于类上时,该类的所有public修饰的方法都具有该类型的事务属性。同时,定义在方法级别上的事务会覆盖此类上的事务属性。
  在spring中建议不要直接在接口和接口方法上使用该注解,因为只有在使用基于接口的代理时它才会生效。
  另外,@Transactional注解只被使用在public方法上,这是有AOP本质决定的,如果在private、protected、默认可见性方法上并不会引起事务。
  默认情况下,只有来自外部的方法调用才会被AOP代理捕获。因此,在类的内部调用本类其他方法并不会引起事务,即使被调用的是public修饰的使用@Trasactional注解的方法。

5.在springboot 使用MyBatis时使用事务时只需要两个注解:
  1.在springboot的启动类上添加@EnableTransactionManagement注解
  2.在需要的service实现类上或者方法上添加@Transactional注解,一般是在需要的方法上
  而这两个注解来自spring-tx.jar包,这个包在添加MyBatis依赖时就已经自动添加了。
  例子:

@@SpringBootApplication
@EnableTransactionManagement
public class StartApplication{
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
@Trasactional(readOnly = true)
public class UserServiceImpl{ @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW,isolation = Isolation.DEFAULT,timeout = 36000,rollbackFoe = Exception.class)
public void getUser(){
// do something ....
}
}

6.多数据源事务管理:
  a.配置文件(application.properties):

    spring.datasource.prod.driver-class-name=com.jdbc.driver.OracleDriver
    spring.datasource.prod.url=jdbc:oracle:thin:@127.0.0.1:3306:prod
    spring.datasource.prod.username=root
    spring.datasource.prod.password=123456     spring.datasource.dev.driver-class-name=com.jdbc.driver.OracleDriver
    spring.datasource.dev.url=jdbc:oracle:thin:@127.0.0.1:3306:dev
    spring.datasource.dev.username=root
    spring.datasource.dev.password=123456

  b.JavaConfig配置类:

// 配置JdbcTemplate模板,在此返回的不是JdbcTemplate,而是其实现接口JdbcOperations.使用@Qualifier指定注入哪个bean,默认名字为该bean的方法名
@Bean
public JdbcOperations prodJdbcOperations(@Qualifier("prodDataSource") DataSource prodDataSource ){
return new JdbcTemplate(prodDataSource);
} @Bean
public JdbcOperations devJdbcOperations(@Qualifier("devDataSource") DataSource devDataSource ){
return new JdbcTemplate(devDataSource);
} // 配置事务管理
@Bean
public PlatformTransactionManager prodTransactionManager(@Qualifier("prodDataSource") DataSource prodDataSource){
return new DataSourceTransactionManager(prodDataSource);
} @Bean
public PlatformTransactionManager devTransactionManager(@Qualifier("devDatasource") DataSource devDatasource){
return new DataSourceTransactionManager(devDatasource);
}
}

  c.使用:

@service
public class ShopServiceImpl{ @Autowired
public JdbcOperations prodJdbcOperations; @Autowired
public JdbcOperations devJdbcOperations; @Transactional(value="prodTransactionManager")
public void prod(){
prodJdbcOperations.queryForList("SELECT * FROM SHOP");
}
@Transactional(value="devTransactionManager")
public void dev(){
devJdbcOperations.queryForList("SELECT * FROM SHOP");
} }

spring——事务管理的更多相关文章

  1. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  2. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  3. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  4. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  5. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

  6. Spring事务管理(转)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  7. [Spring框架]Spring 事务管理基础入门总结.

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  8. Spring 事务管理 01 ——

    目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分

  9. Spring 事务管理原理探究

    此处先粘贴出Spring事务需要的配置内容: 1.Spring事务管理器的配置文件: 2.一个普通的JPA框架(此处是mybatis)的配置文件: <bean id="sqlSessi ...

  10. Spring 事务管理高级应用难点剖析--转

    第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...

随机推荐

  1. C#自定义Winform无边框窗体

    C#自定义Winform无边框窗体 在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF.或者一些第三方的库等.本例中将采用WinF ...

  2. 基于VS Code创建Java command-line app

    由于国产化的原因,公司由.NET转向了Java阵营,之后会不定期分享一些技术转型中的体会.所谓Java的command-line app其实就是.NET项目中的Console Application, ...

  3. day_6.14py网络编程

    被动套接字和新建出套接字的区别 单任务,单线程,非阻塞!!!!服务器! #2018-6-14 16:51:25 #!--*--coding:utf-8 --*-- ''' 单进程,单任务 少的可以,多 ...

  4. B - Space Ant

    The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists trace ...

  5. zouxy09-图像卷积与滤波的一些知识点

    原文地址 图像卷积与滤波的一些知识点 zouxy09@qq.com http://blog.csdn.net/zouxy09 之前在学习CNN的时候,有对卷积进行一些学习和整理,后来就烂尾了,现在稍微 ...

  6. 启动weblogic报错:string value '2.4' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee

    启动报错: 原因:有人改动了web.xml的头 解决方法: 在web.xml中修改抬头为: <?xml version="1.0" encoding="UTF-8& ...

  7. 泡泡一分钟:Exploiting Points and Lines in Regression Forests for RGB-D Camera Relocalization

    Exploiting Points and Lines in Regression Forests for RGB-D Camera Relocalization 利用回归森林中的点和线进行RGB-D ...

  8. 基于LSD的直线提取算法

    https://blog.csdn.net/tianwaifeimao/article/details/17678669 文献翻译:https://blog.csdn.net/YuYunTan/art ...

  9. let 与 const 的用法

    let 与 const 的用法 let 用来声明变量,并且会在当前作用域形成 代码块 conts 用来声明常量,所谓常量就是物理指针不可以更改的变量. 所谓代码块,最简单的做法就是(这个 {} 就是一 ...

  10. 在windows下用nvm 安装node

    nvm 可以帮助切换node版本 在此文中,会特意指明一些坑,防止再次踩坑.第一个坑就是,如果你已经单独安装了node,建议先卸载,再来看本文. 1. nvm 下载 nvm 的下载地址:https:/ ...