目录
1 基于xml的声明式事务控制
1.1 什么是声明式事务控制
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来代替编程式的处理事务。
1.2 声明式事务处理的作用
(1)事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可。(相当于aop思想,切点(被增强的方法)指的是业务逻辑方法,通知指封装增强业务的方法)
(2)在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便
注意:Spring声明式事务控制底层就是aop
1.3 声明式事务控制的实现
- 谁是切点
<!--目标对象 内部的方法就是切点(1、set参数名 2、bean的Id)-->
<bean id="userService" class="service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
- 谁是通知?
平台事务管理器的配置:告诉spring我要使用哪一套api,然后进行事务的控制
<!--配置平台事务管理器(事务的增强需要平台事务管理器)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务通知 事务的增强(需要引用上面配置的平台事务管理器)-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--设置事务的属性信息-->
<tx:attributes>
<!--切点方法的事务参数的配置,也就是说给哪个方法配置事务(一个方法默认对应一个事务),*代表任意方法-->
<tx:method name="*"/>
<tx:method name="update" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
切点方法的事务参数:
- name:切点方法名称
- isolation:事务的隔离级别
- propogation:事务的传播行为
- timeout:超过时间
- read-only:是否只读
- 谁是切面? (配置织入)
<!--配置事务的织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* service.impl.*.*(..))"/>
</aop:config>
2 基于注解的声明式事务控制
2.1 注解配置解析
①使用@Transactional在需要进行事务控制的类或是方法上修饰,注解可用的属性同xml配置方式,例如隔离级别、传播行为等。
②注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
③使用在方法上,不同的方法可以采用不同的事务参数配置。
④Xml配文件中要开启事务的注解驱动<tx:annotation-driven/>
2.2 配置要点
·平台事务管理器配置(xml方式)
<!--配置平台事务管理器(事务知的增强需要平台事务管理器)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
·事务通知的配置(@Transactional注解配置)
·事务注解驱动的配置<tx:annotation-driven/>
<!--事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>