事务一.Java事务

jdk事务思路

  1. 获取连接源
  2. 关闭自动提交
  3. 准备sql语句
  4. 提交
  5. try-catch上面语句,捕获到异常时回滚

spring切面事务(案例springboot版本2.3.7.RELEASE)

开启注解入口@EnableTransactionManagement

在这里插入图片描述
在这里插入图片描述

注册两个类

  1. AutoProxyRegistrar.class
  • 作用:注册代理类入口InfrastructureAdvisorAutoProxyCreator.class,该类在实例化最后判断是否有切面,有就走代理
    把属性设置到bd中,最终添加到工厂中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 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
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值