jdk事务思路
- 获取连接源
- 关闭自动提交
- 准备sql语句
- 提交
- try-catch上面语句,捕获到异常时回滚
spring切面事务(案例springboot版本2.3.7.RELEASE)
开启注解入口@EnableTransactionManagement
注册两个类
- AutoProxyRegistrar.class
- 作用:注册代理类入口InfrastructureAdvisorAutoProxyCreator.class,该类在实例化最后判断是否有切面,有就走代理
把属性设置到bd中,最终添加到工厂中
- ProxyTransactionManagementConfiguration.class
事务管理器
ProxyTransactionManagementConfiguration父类 AbstractTransactionManagementConfiguration 定义了事务管理器
如果需要可以自己实现接口定义事务管理器
@Component
public class TransactionManagementConfigurerBean implements TransactionManagementConfigurer {
private DataSource dataSource;
@Override
public TransactionManager annotationDrivenTransactionManager() {
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
}
代理判断
- class的matches
没有判断class上是否有注解
- method的matches
判断@Transactional注解
- 注意事务方法必须是public,因为走AbstractFallbackTransactionAttributeSource.class时,非public会返回null导致matches为false
- 事务注解method上优先class上
判断完后放到缓存
事务逻辑
- 看事务切面类TransactionInterceptor.class的invoke(),走到TransactionAspectSupport.class
- 获取事务管理器
所以可以实现TransactionManager接口放到spring中配置事务管理器
@Bean
public PlatformTransactionManager TM(DataSource dataSource){
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
- spring事务其实也是try-catch的过程
开启事务
- 获取事务对象
DataSourceTransactionManager.class获取数据源
- 数据源配置
@Value("${spring.datasource.driver-class-name}")
private String driverClass;
@Value("${spring.datasource.url}")
private String jdbcUrl;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
@Bean
public DataSource comboPoolDataSource(){
//C3PO数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(driverClass);
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUser(user);
dataSource.setPassword(password);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return dataSource;
}
- 是否存在事务
- 开启事务
提交事务
AbstractPlatformTransactionManager