美文网首页
声明式事务

声明式事务

作者: 小青多多 | 来源:发表于2022-08-25 14:20 被阅读0次

    一、环境搭建

    • 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.执行目标方法
      如果异常,获取到事务管理器,利用事务管理器回滚操作;
      如果正常,利用事务管理器,提交事务;

    相关文章

      网友评论

          本文标题:声明式事务

          本文链接:https://www.haomeiwen.com/subject/gjaagrtx.html