Spring事务

事务即一系列的数据库操作,要么全部成功,要么全部失败,如果失败了,之前的操作要被回滚。

事务有四个特性 ACID:原子性,一致性,隔离性,持久性。

  • Spring对事务的支持

Spring提供编程式和声明式两种方式来管理事务。 核心类主要是如下三个:TransactionDefinition,PlatformTransactionManager,TransactionStatus。

    TransactionDefinition:在Spring中定义一个事务的接口,具体如下:

该接口设置了5个ISOLATION,也就是事务隔离级别,他是指若干个并发的事务之间的隔离级别:

级别

说明

ISOLATION_DEFAULT

默认值,使用底层数据库的默认隔离级别。对大部分数据库而言,这个值是ISOLATION_READ_COMMITTED

ISOLATION_READ_COMMITTED

该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

ISOLATION_READ_UNCOMMITTED

该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。

ISOLATION_REPEATABLE_READ

该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。

ISOLATION_SERIALIZABLE

所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

该接口设置了7个PROPAGATION,也就是事务传播行为,他指的是如果在开始当前事务之前,一个事务上下文已经存在,此时该行为就可以指定当前事务的行为。

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

TIMEOUT_DEFAULT则指定的事务超时时间,也就是一个事务所允许执行的最长时间,如果超时仍未围城,则自动回滚事务。单位是秒。

如果要指定事务性资源进行只读或者读写操作,可设置readOnly属性。设置只读可提高事务处理的性能。

默认情况下,除了超时原因外,如果事务中跑出未检查的继承自RuntimeException异常,则默认事务回滚。

Spring为我们提供了一个默认的实现类,DefaultTransactionDefinition,可适用于大多数情况,用户也可自己实现TransactionDefinition接口。

 

PlatformTransactionManager

TransactionDefinition是一个事务,而PlatformTransactionManager用于执行具体的事务操作,主要方法如图所示,有开始事务,提交事务,回滚。

根据底层持久化API或者框架的不同,它的主要实现类如下有,DataSourceTransactionManager,HibernateTransactionManager,JpaTransactionManager等等。

TransactionStatus

TransactionStatus通过PlatformTransactionManager.getTransaction(..)方法得到。他可能代表一个新的或者已经存在的事务。他提供了一个简单的控制事务执行和查询事务状态的方法。

 

介绍完3个类,下面介绍先Spring中如何进行编程式事务管理

  1. 基于底层API的编程式事务管理

    就是通过上文提到的3个主要类的API,在代码中显式的进行beginTransaction,commit,rollback等操作。

  2. 利用TransactionTemplate进行编程式事务管理

 

接下来介绍声明式事务管理

声明式的事务管理的实现是建立在AOP基础之上的。本质是对方法前后拦截,做事务开始,提交或者回滚的操作。

优点是不需要通过编程方式在业务逻辑代码中加入事务管理代码,只需配置文件中配置即可(或者基于注解的方式)。

声明式也有4种实现方式:

  1. 基于TransactionInterceptor(已经被spring弃用)
  2. 基于TransactionProxyFactoryBean(spring 2.0中被加入)
  3. 基于 <tx> 命名空间的声明式事务管理(推荐)
  4. 基于 @Transactional 的声明式事务管理(推荐)
posted @ 2013-04-08 14:28  东苑草根  阅读(394)  评论(0编辑  收藏  举报
手牵手 一步两步三步 往上爬