一、Spring事务控制
1. 编程式事务控制
- 了解spring事务控制的原理
- 通过api的了解,推断出配置应该写哪些东西。
2. 事务的传播行为
-
当多个不同的事务交叉调用时,事务是如何协作的。这个定义就是事务的传播行为的设置。
-
增删改方法 使用REQUIRED,只读设置为false
查询方法 使用SUPPORTS,只读推荐设置为true
3. 相关对象
-
TransactionDefination
事务定义对象,用于指定事务管理的一些具体参数(事务隔离级别、事务的传播行为、是否只读…) -
PlatformTransactionManager
事务管理对象,用于使用事务定义对象管理事务。可以获取事务当前的状态,根据状态可以执行事务的提交、回滚操作。
-
TransactionStatus
事务状态对象,用于描述当前事务所处的状态信息的。并不是我们设置的状态,而是获取当前事务的状态。
二、声明式事务控制
1. 介绍
-
声明式事务控制是spring基于aop思想进行封装的,可以解决业务代码和事务管理代码的解耦问题。
通过配置把业务代码和事务管理的代码分离,但是在运行时动态织入完成事务管理代码和业务代码的结合。
2. 配置步骤
-
把涉及到的所有对象配置到IOC容器中(Service、DAO、JdbcTemplate、DataSource)
<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="accountDao" class="com.it.dao.impl.AccountDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <bean id="accountService" class="com.it.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean>
-
配置事务管理器到IOC容器中(spring管理事务最底层还是使用Connection对象进行实现的)
注入一个连接池对象<!--平台事务管理器 配置--> <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="find*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
-
配置切面
- 通知和切入点的关系
- 切入点通过切入点表达式指定
- 关系:
前置、后置、异常、最终通知在事务管理这一操作中都是固定的。 - 所以无需指定通知类型,spring会自动进行配置。只需要指定如下设置:
<!--事务AOP织入 的配置--> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.it.service.impl.*.*(..))"/> </aop:config>
- 通知和切入点的关系
三、注解配置声明式事务
-
前提准备
<!--组件扫描--> <context:component-scan base-package="cn.anno"/> <!--引入jdbc.properties文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
-
在业务类或者业务方法上标注 @Transactional 注解
可以在括号内说明属性
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
-
在配置文件中,开启声明式事务的注解支持
<!--平台事务管理器 配置--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<!--事务的注解驱动--> <tx:annotation-driven transaction-manager="transactionManager"/>