目录

一,编程式事务控制相关对象

1,PlatformTransactionManager接口“对象”

2,TransactionDefinition“对象”

3,TransactionStatus接口“对象”

二,声明式事务控制

1,基于XML的声明式事务控制

2,基于注解的声明式事务控制


一,编程式事务控制相关对象

1,PlatformTransactionManager接口“对象”

PlatformTransactionManager接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法。

java事务管理模式 java 事务控制_后端

注意:PlatformTransactionManager是接口类型,不同的Dao层技术有不同的实现类。

如Dao层技术是jdbc或mybatis时的实现类是:

java事务管理模式 java 事务控制_java事务管理模式_02

Dao层技术是hibernate时的实现类是:

java事务管理模式 java 事务控制_声明式事务_03

2,TransactionDefinition“对象”

TransactionDefinition是事务的定义信息对象

java事务管理模式 java 事务控制_spring_04

(1)事务的隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读,不可重复读和虚读

ISOLATION_DEFAULT

默认

ISOLATION_READ_UNCOMMITTED

读,未提交

ISOLATION_ READ_COMMITTED

读,提交(可以解决脏读)

ISOLATION_REPEATABLE_ READ

可重复读(可以不可重复读)

ISOLATION_SERIALIZABLE

串行化(都可以解决但性能差,相当于缩表)

(2)事务的传播行为

传播行为主要的作用是解决业务方法在调用业务方法时它们之间事务的统一性的问题

java事务管理模式 java 事务控制_java事务管理模式_05

(3)超时时间

默认值为-1,没有时间限制,如果有,以秒为单位进行设置。超过多少时间就终止事务。

(4)是否只读

设置了,事务就只能查询而不能增删改。

3,TransactionStatus接口“对象”

TransactionStatus接口提供的是事务具体运行状态,方法如下:

java事务管理模式 java 事务控制_后端_06

这是状态是系统自动配置,无需我们手动配置,我们只需查看状态就行。

二,声明式事务控制

Spring的声明式事务控制就是采用声明的方式来处理事务。这里的声明就是指在配置文件中声明,用在spring配置文件中声明式的处理事务来代替代码式的处理业务

注意:Spring声明式事务控制底层就是AOP

1,基于XML的声明式事务控制

(1)搭建转账业务的代码来测试事务

Account类,用于封装name和money里面有set,get,toString方法

java事务管理模式 java 事务控制_java事务管理模式_07

Dao层的实现转入,转出方法接口的类。

java事务管理模式 java 事务控制_java_08

Service层一个转账方法的调用。

java事务管理模式 java 事务控制_spring_09

Web层用一个类模拟一下

java事务管理模式 java 事务控制_后端_10

XML配置文件

注入Dao层,service层对象并set注入对应参数,Jdbc需要配置数据源。

java事务管理模式 java 事务控制_声明式事务_11

数据库

java事务管理模式 java 事务控制_java_12

测试

java事务管理模式 java 事务控制_java_13

转账成功,tim转给tom500。

(2)事务控制的引入

一般对业务层的transfer方法进行事务控制,

java事务管理模式 java 事务控制_java_14

每执行一个update就默认是一个事务,这样out和in就是两个事务不方面管理。

java事务管理模式 java 事务控制_后端_15

如果它们之间有一个异常。那么会导致out方法执行了,in方法不执行,这会导致tim的钱少了500,而tom的钱没有多500,所以引用事务控制,让两个方法事务一致。原理是使用AOP思想,对transfer方法进行事务的增强,来达到,要么in和out两个方法同时执行,要么不执行。

(3)声明式事务控制的实现(AOP的配置思想)

引用tx命名空间,因为这个事务增强的具体方法不是我们写,我们只需要调用。

java事务管理模式 java 事务控制_java_16

目标对象(因为要对AccountServiceImpl类中的transfer方法增强)

java事务管理模式 java 事务控制_spring_17

配置平台事务管理器(因为参数是datasource,所以它用于事务的控制)

java事务管理模式 java 事务控制_后端_18

配置TransactionDefinition事务定义对象,用于定义事务的属性,在配置文件中相当于切面

java事务管理模式 java 事务控制_声明式事务_19

配置织入,让切面对目标方法进行事务增强

先引入aop命名空间

java事务管理模式 java 事务控制_spring_20

再配置织入

java事务管理模式 java 事务控制_声明式事务_21

(4)测试

java事务管理模式 java 事务控制_java_22

能否达到出现非零异常同时数据库的数据不改变。

控制台

java事务管理模式 java 事务控制_spring_23

数据库

java事务管理模式 java 事务控制_java事务管理模式_24

完成事务的统一。达到了加强事务的效果

(5)切面属性的介绍

java事务管理模式 java 事务控制_java_25

name=“*”表示对所有控制的方法(填方法名)。后面的参数表示隔离级别,传播行为,超时时间,是否可读,用于对控制的方法做进一步的控制。

2,基于注解的声明式事务控制

(1)Dao层和service层进行注解操作

Dao层

java事务管理模式 java 事务控制_java_26

Service层

java事务管理模式 java 事务控制_java_27

(2)Xml配置文件配置逐渐扫描

首先添加context命名空间再添加扫描

java事务管理模式 java 事务控制_spring_28

(3)还要切面和织入也可以用注解配置

这是在需要增强的方法上配置与切面的织入和aop有点不同。

java事务管理模式 java 事务控制_声明式事务_29

@Transactional注解中可以填入属性,如隔离级别,传播行为,超时时间,是否可读,用于对控制的方法做进一步的控制。

(4)配置事务的注解驱动驱动

java事务管理模式 java 事务控制_java事务管理模式_30

(5)测试

先测试有非零异常的事务控制

java事务管理模式 java 事务控制_java事务管理模式_31

控制台

java事务管理模式 java 事务控制_spring_32

数据库

java事务管理模式 java 事务控制_后端_33

事务得到了统一

再测试有非零异常,不用事务控制

控制台

java事务管理模式 java 事务控制_后端_34

数据库

java事务管理模式 java 事务控制_声明式事务_35

再测试没有异常的事务控制

java事务管理模式 java 事务控制_后端_36

数据库

java事务管理模式 java 事务控制_spring_37

 

java事务管理模式 java 事务控制_后端_38

总结: Spring声明式事务控制底层就是AOP,这是实现代码解耦的利器,让我们可以在不改变原代码功能流程的基础上去加入新功能,去实现代码的扩展性。

 注意要添加aspectj这个重要的依赖

java事务管理模式 java 事务控制_后端_39