1.声明式事务控制
1. 编程式事务控制相关对象
1.1 PlatformTransactionManager
PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。
注意:
PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类
Dao 层技术是jdbc 或mybatis 时:
- org.springframework.jdbc.datasource.DataSourceTransactionManager
Dao 层技术是hibernate时:
- org.springframework.orm.hibernate5.HibernateTransactionManager
注意:该对象是用来提交事务回滚事务的对象,需要在配置文件中进行配置,并且需要注入数据源(DataSource对象),告诉该对象数据库的位置。
1.2 TransactionDefinition
TransactionDefinition 是事务的定义信息对象,里面有如下方法:
1. 事务隔离级别
设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED
- ISOLATION_READ_COMMITTED
- ISOLATION_REPEATABLE_READ
- ISOLATION_SERIALIZABLE
通俗解释:
红箭头指的是一个转出金额的方法,一个转入金额的方法
绿箭头指的是一个会报异常by/zero的方法
当转出金额的代码方法执行完以后,执行绿箭头的代码,报出异常,下面的代码就不会执行了,所以会导致钱已经转出了,但是对方没有收到的情况,所以转出转入方法要么都执行,要么都不执行,这就是要进行事务隔离的原因。
2. 事务传播行为
1.3 TransactionStatus
TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。
注意:
- 该对象是不需要进行任何声明配置的,因为这个对象是会根据程序运行,进行实时变化的,
所以我们可以认为事务具体的运行状态等于PlatformTransactionManager实现类和TransactionDefinition对象的参数配置。
1.4 知识要点
编程式事务控制三大对象
- PlatformTransactionManager
- TransactionDefinition
- TransactionStatus
2. 基于 XML 的声明式事务控制
2.1 什么是声明式事务控制
Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在Spring 配置文件中声明式的处理事务来代替代码式的处理事务。
声明式事务处理的作用
- 事务管理不侵入开发的组件。对方法进行事务增强,只需要在配置文件上进行配置,不需要进入到代码中修改,实现了一个高内聚,低耦合。如果想对代码中增强的事务进行参数的更改,也只需要在配置文件中进行修改即可。
- 在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译, 这样维护起来极其方便
注意:Spring 声明式事务控制底层就是AOP。
2.2 声明式事务控制的实现
声明式事务控制明确事项:
- 谁是切点?
- 谁是通知?
- 配置切面?
①引入tx命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
②配置事务增强
- 事务平台管理器中要注入DataSource对象,让事务平台管理器知道数据库的位置。
③配置事务 AOP 织入
pointcut表示要增强的方法
④测试事务控制转账业务代码(业务层)
2.3 切点方法的事务参数的配置
其中,tx:method 代表切点方法的事务参数的配置,例如:
其中,tx:method 代表切点方法的事务参数的配置,例如:
<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED"
timeout="-1" read-only="false"/>
- name:切点方法名称
- isolation:事务的隔离级别
- propogation:事务的传播行为
- timeout:超时时间
(默认值是-1,没有超时限制。如果有,以秒为单位进行设置。) - read-only:是否只读(建议查询时设置为只读)
2.4 知识要点
声明式事务控制的配置要点
- 平台事务管理器配置
- 事务通知的配置
- 事务aop织入的配置
3. 基于注解的声明式事务控制
3.1 使用注解配置声明式事务控制
-
编写 AccoutDao
-
编写 AccoutService
使用@Transactional在方法或类上加注解,表示给当前方法或者给当前类下的所有方法增加事务功能。
(当类上和方法上都有@Transactional注解时,就近原则,以方法上的注解为标准)
-
编写 applicationContext.xml 配置文件
3.2 注解配置声明式事务控制解析
- 使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。
- 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
- 使用在方法上,不同的方法可以采用不同的事务参数配置。
- Xml配置文件中要开启事务的注解驱动<tx:annotation-driven />
3.3 知识要点
注解声明式事务控制的配置要点
- 平台事务管理器配置(xml方式)
- 事务通知的配置(@Transactional注解配置)
- 事务注解驱动的配置 tx:annotation-driven/