启动详解

  • 本篇文章开始,我们将开始阅读源码
  • 首先看任何框架的源码都需要找到框架的入口,meepo也不例外,先看meepo-test里bussiness方法片段

  • 以上的事务配置和本地事务没有区别,用一个@Transactional注解表示方法的sql被事务管理。

    我们知道,spring的声明式事务由aop实现,在注解方法前后加上事务控制代码,如下

    获取事务管理器

    final PlatformTransactionManager tm = determineTransactionManager(txAttr);

    这里的transactionManager,可以是spring默认,也可以我们自己在xml里配置一个实现PlatformTransactionManager接口的bean来代替

    jar包里的jta-supports-dubbo.xml配置了spring支持JTA的事务管理器

    这样JtaTransactionManager接管了spring的声明式事务,如上面的回滚和提交代码

JtaTransactionManager 解析

  • 按照JTA规范,JtaTransactionManager里初始化了userTransaction和transactionManager两个成员实例,这里不清楚的同学再回头看上篇文章里的 JTA 深度历险

  • 我们继续跟踪代码,进入userTransaction的实现类UserTransactionImpl 方法

    这里的begin()方法作用是初始化全局事务,在前面invokeWithinTransaction的调用路径如下

    最后的doBegin()方法是AbstractPlatformTransactionManager的一个虚拟方法,在自定义子类JtaTransactionManager中实现具体功能,这里用到了模版方法设计模式

    JtaTransactionManager把doBegin()委托给了userTransaction,如下

    userTransaction又委托给了transactionManager,如第一个图所示。

    这里需要说明的是,userTransaction把所有的实现都委托给了transactionManager,实际上是不需要这一层。userTransaction是JTA规范的一部分,属于用户编程,可以开放给客户端重写

  • 小结本文讲述了spring声明式事务的实现,以及自定义事务管理器如何接管spring的事务管理器

    注意当前还没涉及到分布式事务具体实现,阅读本文需要先了解JTA规范

    图中的spring代码入口是JdkDynamicAopProxy类,如果用cglib,则是CglibAopProxy类