事务分析
2021-03-01 11:21:33 0 举报
为你推荐
查看更多
spring事务源码分析
作者其他创作
大纲/内容
多个数据源才会调用,如果为一个数据源会调用这个数据源池的自身方法,下面这个类是spring 搞的,也是实现DataSource接口AbstractRoutingDataSource
AbstractFallbackTransactionAttributeSource
可以看到如果没有配置动态数据源会使用默认的this.resolvedDefaultDataSource
找具体子类的
如果是第二次进入事务切面,执行此方法。handleExistingTransaction
返回数据库连接
2
AnnotationTransactionAttributeSource
父类
接口类型
数据源事务管理器DataSourceTransactionManager
从前线程ThreadLocal获得连接getResource
事务拦截通知TransactionInterceptor
TransactionSynchronizationManager
入参有@Transactional属性封装好的RuleBaseTransactionAttribute
parseTransactionAnnotation
findTransactionAttribute
1
getTransactionAttribute
事务对象:DataSourceTransactionObject
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { String ds = DynamicDataSourceHolder.getDs(); System.out.println(\"=========选择的数据源:\" + ds); return ds; }}
封装@Transactional的属性到 RuleBasedTransactionAttribute
doBegin
开启事务createTransactionIfNecessary
determineCurrentLookupKey
思考一个问题:aop 的入口类和事务注解的入口类 会选择哪一个?
doGetTransaction
配置动态数据源
determineTargetDataSource
数据源事务管理器AbstractPlatformTransactionManager
返回的是 一个封装好的 new DataSourceTransactionObject() [注意这个new 是故意写的别误会为返回的的是个new 对象]
在注册事务入口类时会比较优先级
接口AnnotationTransactionAttributeSource
invokeWithinTransaction
钩子类的方法
determineTransactionAttribute
getTransaction
循环遍历annotationParsers然后调用parseTransactionAnnotation
invoke
封装连接为DataSourceTransactionObject
getConnection
0 条评论
回复 删除
下一页