当前位置:
文档之家› SSM开发实战教程(Spring+Spring MVC+Mybatis) 第8章 Spring事务管理
SSM开发实战教程(Spring+Spring MVC+Mybatis) 第8章 Spring事务管理
要么全部不执行。 C:Consistency,一致性,事务执行的结果必须是使数据库从
一个一致状态变到另一个一致状态。 I:Isolation,隔离性,即一个事务的执行不能被另一个事务影
响。 D:Durabillity,持久性,即事务提交后将被永久保存。
8.1 Spring 事务管理接口
在Java EE开发中,事务原本属于Dao层中的范畴,但 一般情况下需要将事务提升到业务层(Service层), 以便能够使用事务的特性来管理具体的业务。 Spring的事务管理,主要用到两个事务相关的接口。 8.1.1 事务管理器接口PlatformTransactionManager 8.1.2 事务定义接口TransactionDefinition
SSM开发实战教程
第8章 Spring事务管理
事务(Transaction)是访问数据库的一个操作序列,这些操作 要么都做,要么都不做,是一个不可分割的工作单元。通过事 务,数据库能将逻辑相关的一组操作绑定在一起,以便保持数 据的完整性。
事务有4个重要特性,简称ACID。 A:Automicity,原子性,即事务中的所有操作要么全部执行,
为了解决并发问题,TransactionDefinition接口定义了5个事务隔离常 量如下: ISOLATION_DEFAULT:采用数据库默认的事务隔离级别。不同数
据库不一样,MySql的默认为 REPEATABLE_READ(可重复读); Oracle默认为READ_COMMITTED(读已提交)。 ISOLATION _READ_UNCOMMITTED:读未提交。允许另外一个事 务读取到当前事务未提交的数据,隔离级别最低,未解决任何并 发问题,会产生脏读,不可重复读和幻像读。 ISOLATION _READ_COMMITTED:读已提交,被一个事务修改的数 据提交后才能被另外一个事务读取,另外一个事务不能读取该事 务未提交的数据。解决脏读,但还存在不可重复读与幻读。 ISOLATION _REPEATABLE_READ:可重复读。解决了脏读、不可 重复读,但还存在幻读。 ISOLATION _SERIALIZABLE:串行化。按时间顺序一一执行多个事 务,不存在并发GATION_ SUPPORTS:指定的方法支持当前事务,但若 当前没有事务,也可以以非事务方式执行。
PROPAGATION_ MANDATORY:指定的方法必须在当前事务内 执行,若当前没有事务,则直接抛出异常。
PROPAGATION_ REQUIRES_NEW:总是新建一个事务, 若当前存在事务,就将当前事务挂起,直到新事务执行 完毕。
2.事务传播行为常量
事务传播行为是指处于不同事务中的方法在相互调用
时,执行期间事务的维护情况。例如,当一个事务方
法B调用另一个事务方法A时,应当明确规定事务如何 传播,比方可以规定A方法继续在B方法的现有事务中 运行,也可以规定A方法开启一个新事务,在新事务中 运行,现有事务先挂起,等A方法的新事务执行完毕后 再恢复。TransactionDefinition接口一共定义了七种传 播行为常量说明如下。
8.1.2 事务定义接口 TransactionDefinition
事务定义接口 TransactionDefinition 中定义了事务描 述相关的三类常量:事务隔离级别常量、事务传播 行为常量、事务默认超时时限常量,及对它们的操 作。
1.事务隔离级别常量 在应用程序中,多个事务并发运行,操作相同的数据,可能会引 起脏读,不可重复读,幻读等问题 。 脏读(Dirty reads):第一个事务访问并改写了数据,尚未提交事 务,这时第二个事务进来了,读取了刚刚改写的数据,如果这时 第一个事务回滚了,这样第二个事务读取到的数据就是无效的 “脏数据”。 不可重复读(Nonrepeatable read):第一个事务在其生命周期 内多次查询同一个数据,在两次查询之间,第二个事务访问并改 写了该数据,导致第一个事务两次查询同一个数据得到的结果不 一样。 幻读(Phantom read)——幻读与不可重复读类似。它发生在第 一个事务在生命周期进行了两次按同一查询条件查询数据,第一 次按该查询条件读取了几行数据,这时第二个事务进来了,插入 或删除了一些数据时,然后第一个事务再次按同一条件查询,发 现多了一些原本不存在的记录或者原有的记录不见了。
8.1.1 事务管理器接口 PlatformTransactionManager
事务管理器接口PlatformTransactionManager主要用于完成 事务的提交、回滚,及获取事务的状态信息。 PlatformTransactionManager接口有两个常用的实现类: DataSourceTransactionManager实现类:使用JDBC或 MyBatis进行数据持久化时使用。 HibernateTransactionManager实现类:使用Hibernate进行 数据持久化时使用。 关于Spring的事务提交与回滚方式,默认是:发生运行时异 常时回滚,发生受检查异常时提交, 也就是说程序抛出 runtime异常的时候才会进行回滚,其他异常不回滚。
PROPAGATION_ NOT_SUPPORTED:指定的方法不能在事 务环境中执行,若当前存在事务,就将当前事务挂起。
PROPAGATION_ REQUIRED:指定的方法必须在事务内执行。 若当前存在事务,就加入到当前事务中;若当前没有事务,则 创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。如该传播行为加在actionB ()方法上,该 方法将被actionA ()调用,若actionA ()方法在执行时就是在事务 内的,则actionB ()方法的执行也加入到该事务内执行。若 actionA ()方法没有在事务内执行,则actionB ()方法会创建一个 事务,并在其中执行。