一、环境搭建
- 1)导入相关依赖
数据源、数据库驱动、spring-jdbc模块
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java 数据源 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 数据库驱动 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc spring-jdbc模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
- 2)配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作数据
- 3)给方法上标注 @Transactional 表示当前方法是一个事务方法;
- 4) @EnableTransactionManagement 开启基于注解的事务管理功能;
@EnableXXX - 5)配置事务管理器来控制事务【重要的一步】
@Bean
public PlatformTransactionManager transactionManager() throws Exception{
return new DataSourceTransactionManager(dataSource());
}
二、原理
-
1) @EnableTransactionManagement
利用 TransactionManagementConfigurationSelector 给容器中会导入组件
导入两个组件:AutoProxyRegistrar、ProxyTransactionManagementConfiguration -
2) AutoProxyRegistrar 给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;后置处理器
InfrastructureAdvisorAutoProxyCreator ?
利用后置处理器机制在对象创建之后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用; -
3) ProxyTransactionManagementConfiguration 做了什么?
给容器中注册事务增强器;
1.事务增强器要用事务注解的信息, AnnotationTransactionAttributeSource 解析事务注解
2.事务拦截器:
TransactionInterceptor 保存了事务属性信息,事务管理器;
它是一个 MethodInterceptor 方法拦截器;
在目标方法执行的时候;
执行拦截器链;
事务拦截器:
2.1.先获取事务相关的属性;TransactionAttribute
2.2.再获取 PlatformTransactionManager ;如果事先没有添加指定任何transactionManager,
最终会从容器中按照类型获取一个PlatformTransactionManager
2.3.执行目标方法
如果异常,获取到事务管理器,利用事务管理器回滚操作;
如果正常,利用事务管理器,提交事务;
网友评论