什么是声明式事务控制

Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的说明,就是指在配置文件中声明,用在Spring配置文 件中声明式的处理事务来代替代码式的处理事务

 

声明式事务处理的作用

 

1、事务管理不侵入开发的组件。具体的说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因此事务管理是属于系统层面的服务,而不是业务逻 辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可。简单说就是系统层面(事务所在的层面)的代码与业务层面的代码分开,解耦

2、在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便

3、注意,Spring声明式事务控制的底层其实就是AOP(a_19_0笔记有学,可前去),也就是业务对象是切点、事务管理是增强,可以通过配置实现切点与增强的织入

 

快速入门

 

声明式事务控制要明确的事项:

1、谁是切点 业务方法是切点,也就是AccountServiceImpl类的transfer方法

2、谁是通知(通知也叫增强) 事务控制是通知,

3、配置切面

 

具体操作:

 

第一步: 创建src/main/java/com.huanf目录

 

第二步: 在com.huanf目录下新建controller目录,里面新建AccountController类,里面写入如下

 

第三步: 在com.huanf目录下新建dao目录,里面新建AccountDao接口,写入如下

 

第四步: 在com.huanf.dao目录下新建impl目录,里面新建AccountDaoImpl类,写入如下

 

第五步: 在com.huanf目录下新建domain目录,里面新建Account类,写入如下

 

第六步: 在com.huanf目录下新建service目录,里面新建AccountService接口,写入如下

 

第七步: 在com.huanf.service目录下新建impl目录,里面新建AccountServiceImpl类,写入如下

第八步: 在applicationContext.xml里面写入如下

 

第九步: pom.xml里面写入如下

 

第十步: 在AccountController类运行测试

 

上面是快速入门,下面我们会详细分析一下

 

事务属性参数的配置

 

也就是分析我们在applicationContext.xml里面配置的代码,会把源代码贴出来,然后在它下面进行分析

 

1、

其中DataSourceTransactionManager是我们在a_22_0学的编程式事务控制的第一个对象(PlatformTransactionManager平台事务管理器对象),当时就说过如下: PlatformTransactionManager对象是接口类型的,不同的Dao层技术则有不同的实现类,例如如下

 

2、Dao层技术是jdbc或mybatis时: 实现类是org.springframework.jdbc.datasource.DataSourceTransactionManager

 

3、Dao层技术是hibernate时: 实现类是org.springframework.orm.hibernate5.HibernateTransactionManager 我们在使用PlatformTransactionManager对象时,由于它是个接口我们不能直接用,得用它的实现类,用哪个实现类取决于是什么Dao层技术。所有由于我们使用的Dao层技术是jdbc,所以选取的实现类是DataSourceTransactionManager

 

4、

其中pointcut代表切点,里面我们要写切点表达式,由于我们是对事务增强,所以一般切点就是业务方法,所以切点表达式就写我们的业务方法(service业务层),例 如execution(* com.huanf.service.impl..(..))

advice-ref代表通知引用,它的值就是我们在tx:advice标签里写的id值

 

5.

其中transaction-manager表示引入一个事务管理器,就是上面第1点的事务管理器的的id值 其中tx:attributes的tx表示事务,attributes表示属性。就是我们在a_22_0学的编程式事务控制的第二个对象(TransactionDefinition),表示事务的属性信息 其中tx:method的method表示要增强的方法,这个方法就是切点,也就是需要我们指定哪些方法(在com.huanf.service.impl..下的方法)需要被增强,name表示方法名称,表示所有方法,isolation表示隔离级别,propagation表示传播行为,timeout表示失效时间。read-only表示是否只读,查询方法只读就行,增删改方法是读写,一般是对数据库的操作,其中trans表示以trans开头的方法