Spring事务

in JAVA with 0 comment

并发事务带来的问题

不可重复度和幻读区别: 不可重复读的重点是修改,幻读的重点在于新增或者删除。

Spring拥有简单而强大的事务管理功能,包括编程式事务和声明式事务。

  1. Spring中涉及到事务管理的API有100多个,核心的只有三个:** TransactionDefinition、PlatformTransactionManager、TransactionStatus。** 所谓事务管理,其实就是按照给定的事务规则来执行提交或者回滚操作。“给定的事务规则”就是用 TransactionDefinition 表示的,“按照……来执行提交或者回滚操作”便是用 PlatformTransactionManager 来表示,而 TransactionStatus 用于表示一个运行着的事务的状态。
  2. TransactionDefinition, 该接口用于定义一个事务。它包含了事务的静态属性,比如:事务传播行为、超时时间等等。Spring 提供了一个默认的实现类:DefaultTransactionDefinition,该类适用于大多数情况。如果该类不能满足需求,可以通过实现 TransactionDefinition 接口来实现自己的事务定义。
  3. PlatformTransactionManager 用于执行具体的事务操作。 根据底层所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要实现类大致如下:
  1. 编程式事务需要你在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束时候,关闭事务.
  2. 声明式的事务的做法是在a方法外围添加注解或者直接在配置文件中定义,a方法需要事务处理,在spring中会通过配置文件在a方法前后拦截,并添加事务. 二者区别.编程式事务侵入性比较强,但处理粒度更细. 相当于一个是手动事务,另一个是系统自动事务。 编程试事务就是需要手工写代码提交事务,回滚事务等。 声明性事务就是在配置文件里面定义一下什么时候需要事务,到时候系统会自动commit,出异常了自动rollback,不需要在代码里面写commit或者rollback。

隔离级别

TransactionDefinition 接口中定义了五个表示隔离级别的常量:

事务传播行为

在TransactionDefinition定义中包括了如下几个表示传播行为的常量: 支持当前事务的情况:

不支持当前事务的情况:

其他情况:

这里需要指出的是,前面的六种事务传播行为是 Spring 从 EJB 中引入的,他们共享相同的概念。而 PROPAGATION_NESTED 是 Spring 所特有的。以 PROPAGATION_NESTED 启动的事务内嵌于外部事务中(如果存在外部事务的话),此时,内嵌事务并不是一个独立的事务,它依赖于外部事务的存在,只有通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交。如果熟悉 JDBC 中的保存点(SavePoint)的概念,那嵌套事务就很容易理解了,其实嵌套的子事务就是保存点的一个应用,一个事务中可以包括多个保存点,每一个嵌套子事务。另外,外部事务的回滚也会导致嵌套子事务的回滚。