Ok,spring的源码学习到了事务这块就大概要告一段落了,后续如果有机会的话,会开启spring-boot的学习。不过目前还是打算把下一段的学习计划放在其他事情上。先对事务这块做一个简要的学习笔记,后续的规划再说。

总体来说,Spring的事务管理的实现,是通过aop来实现的,其实也很好理解,对一个方法加上事务,也就意味着在方法执行之前,需要begin这个事务,在方法结束后,需要做commit操作,如果方法执行失败,就进行回滚操作。

这里主要说下声明式事务的部分,编程式的事务其实也差不多,所以就不提了。

首先是对声明的事务的一些属性进行存储,在spring里,有一个类来专门存储这些属性,就是TransactionAttributeSource ,这个类的创建在tx标签的handler是可以看到的。

后续对于@Transactional的解析和前面分析过的无数的注解的生效一毛一样,都是通过一个beanPostProcessor,然后在解析到希望的注解后,给这个对象生成代理对象返回,过程和aop的那套过程是一样的。

最关键的是在生成代理是使用到的advisor,在看tx标签的handler的时候,可以看到有俩个关键的类的注入,TransactionInterceptoer和BeanFactoryTransactionAttributeSourceAdvisor. 在BeanFactoryTransactionAttributeSourceAdvisor类里,可以看到pointCut对类进行匹配的操作。在TransactionInterceptoer里可以看到方法前后,加入的事务相关的一系列代码。具体的逻辑就不多说了,无非还是上面说的那样,在方法开始前begin,在方法后进行commit或者回滚。不过因为要考虑嵌套事务,还有不同数据源的一些差异性,逻辑稍微有点复杂,可以在需要的时候自己看下。

另外就是,每中数据源都有自己的transactionManager,里面具体实现了beigin,commit,roback的逻辑,但是貌似是不支持多数据源混合操作的情况的。

Ok,就简要的记录下。