zoukankan      html  css  js  c++  java
  • spring事物的源码分析

    主流程分析:

    1、通过annotation-driven标签 进行 解析、注册。

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

     init方法中,通过AnnotationDrivenBeanDefinitionParser 对标签进行解析,将其中用来对bean进行包装的beanPostProcessor的advisor 注册到BeanDefinitionRegistry中去。

    org.springframework.transaction.config.TxNamespaceHandler.init();
    @Override
    public void init() {
    registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
    registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
    registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
    }

    2、在bean初始化的的阶段,解析符合该bean上的事物注解的advisor,通过cglib构造代理bean, 将相应的TransactionIntecepter 设置到这个代理bean中。

    3、在bean的实际调用阶段,通过代理bean来使用。使用的时候,通过TransactionIntecepter ,进行try catch finally 的 提交、回滚操作。

      其中事物实现的技巧,

      1、进入事物拦截器,则将connection设置为非自动提交,在整个事物完成后,再重置connection的提交为自动提交。

      2、在调用方法的时候,通过线程变量,将当前connection加入进去,后续其他方法获取的connection,也从这个线程变量中去取。这样同一个事物中的connection就是使用的同一个。

    这样在提交、回滚的时候,这个连接下的操作就保证了原子性。

    细节分析:

     
  • 相关阅读:
    Eclipse中用两个控制台测试网络通信程序
    c++ primer 11 泛型算法
    c++ primer 10 关联容器
    c++ primer 9 顺序容器
    c++ primer 8 标准IO库
    安装使用
    InfluxDB介绍
    proxy.go
    monitor.go
    balancer.go
  • 原文地址:https://www.cnblogs.com/chenjfblog/p/13471375.html
Copyright © 2011-2022 走看看