目录
一,编程式事务控制相关对象
1,PlatformTransactionManager接口“对象”
2,TransactionDefinition“对象”
3,TransactionStatus接口“对象”
二,声明式事务控制
1,基于XML的声明式事务控制
2,基于注解的声明式事务控制
一,编程式事务控制相关对象
1,PlatformTransactionManager接口“对象”
PlatformTransactionManager接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法。
注意:PlatformTransactionManager是接口类型,不同的Dao层技术有不同的实现类。
如Dao层技术是jdbc或mybatis时的实现类是:
Dao层技术是hibernate时的实现类是:
2,TransactionDefinition“对象”
TransactionDefinition是事务的定义信息对象
(1)事务的隔离级别
设置隔离级别,可以解决事务并发产生的问题,如脏读,不可重复读和虚读
ISOLATION_DEFAULT
默认
ISOLATION_READ_UNCOMMITTED
读,未提交
ISOLATION_ READ_COMMITTED
读,提交(可以解决脏读)
ISOLATION_REPEATABLE_ READ
可重复读(可以不可重复读)
ISOLATION_SERIALIZABLE
串行化(都可以解决但性能差,相当于缩表)
(2)事务的传播行为
传播行为主要的作用是解决业务方法在调用业务方法时它们之间事务的统一性的问题
(3)超时时间
默认值为-1,没有时间限制,如果有,以秒为单位进行设置。超过多少时间就终止事务。
(4)是否只读
设置了,事务就只能查询而不能增删改。
3,TransactionStatus接口“对象”
TransactionStatus接口提供的是事务具体运行状态,方法如下:
这是状态是系统自动配置,无需我们手动配置,我们只需查看状态就行。
二,声明式事务控制
Spring的声明式事务控制就是采用声明的方式来处理事务。这里的声明就是指在配置文件中声明,用在spring配置文件中声明式的处理事务来代替代码式的处理业务
注意:Spring声明式事务控制底层就是AOP
1,基于XML的声明式事务控制
(1)搭建转账业务的代码来测试事务
Account类,用于封装name和money里面有set,get,toString方法
Dao层的实现转入,转出方法接口的类。
Service层一个转账方法的调用。
Web层用一个类模拟一下
XML配置文件
注入Dao层,service层对象并set注入对应参数,Jdbc需要配置数据源。
数据库
测试
转账成功,tim转给tom500。
(2)事务控制的引入
一般对业务层的transfer方法进行事务控制,
每执行一个update就默认是一个事务,这样out和in就是两个事务不方面管理。
如果它们之间有一个异常。那么会导致out方法执行了,in方法不执行,这会导致tim的钱少了500,而tom的钱没有多500,所以引用事务控制,让两个方法事务一致。原理是使用AOP思想,对transfer方法进行事务的增强,来达到,要么in和out两个方法同时执行,要么不执行。
(3)声明式事务控制的实现(AOP的配置思想)
引用tx命名空间,因为这个事务增强的具体方法不是我们写,我们只需要调用。
目标对象(因为要对AccountServiceImpl类中的transfer方法增强)
配置平台事务管理器(因为参数是datasource,所以它用于事务的控制)
配置TransactionDefinition事务定义对象,用于定义事务的属性,在配置文件中相当于切面
配置织入,让切面对目标方法进行事务增强
先引入aop命名空间
再配置织入
(4)测试
能否达到出现非零异常同时数据库的数据不改变。
控制台
数据库
完成事务的统一。达到了加强事务的效果
(5)切面属性的介绍
name=“*”表示对所有控制的方法(填方法名)。后面的参数表示隔离级别,传播行为,超时时间,是否可读,用于对控制的方法做进一步的控制。
2,基于注解的声明式事务控制
(1)Dao层和service层进行注解操作
Dao层
Service层
(2)Xml配置文件配置逐渐扫描
首先添加context命名空间再添加扫描
(3)还要切面和织入也可以用注解配置
这是在需要增强的方法上配置与切面的织入和aop有点不同。
@Transactional注解中可以填入属性,如隔离级别,传播行为,超时时间,是否可读,用于对控制的方法做进一步的控制。
(4)配置事务的注解驱动驱动
(5)测试
先测试有非零异常的事务控制
控制台
数据库
事务得到了统一
再测试有非零异常,不用事务控制
控制台
数据库
再测试没有异常的事务控制
数据库
总结: Spring声明式事务控制底层就是AOP,这是实现代码解耦的利器,让我们可以在不改变原代码功能流程的基础上去加入新功能,去实现代码的扩展性。
注意要添加aspectj这个重要的依赖