【Spring事务代理逻辑源码分析】
2024-04-09 17:39:14 0 举报
登录查看完整内容
本文详细分析了Spring事务代理逻辑的源码,旨在帮助开发者更深入地理解Spring的事务管理机制。Spring事务代理的核心内容是通过动态代理机制,为业务类生成代理对象,实现对事务的管理和协调。在实现上,Spring事务代理主要涉及两个关键文件:ProxyFactory类和TransactionInterceptor类。其中,ProxyFactory类用于生成代理对象,而TransactionInterceptor类则是拦截器,负责处理事务的开启、提交、回滚等操作。同时,Spring事务代理还使用了多种Java关键字和注解,如@Transactional、final、super等,以提高代码的可读性和灵活性。最后,本文还通过代码示例展示了如何通过Spring事务代理来实现数据库操作的事务管理。
作者其他创作
大纲/内容
invokeWithinTransaction
new String[]
this.cachedAdvisorBeanNames = advisorNames
JdkDynamicAopProxy#invoke
默认数据库的隔离级别
获取事务对象
解析切面
外部没有事务
默认PROXY
ReflectiveMethodInvocation#proceed
doBegin
或者
transaction = doGetTransaction()
传播行为=REQUIRES_NEW
事务解析切面与AOP流程相同,切点没有使用AspectJ,解析@Transactional
就是获取对应配置类注册的Advisor
@EnableTransactionManagement
传播行为=NEVER
是
registerBeanDefinitions
开启新的事务
提交事务
发生异常
注册三个bean
传播行为=MANDATORY
注册解析AOP的bean后置处理器InfrastructureAdvisorAutoProxyCreator.class
判断是否已存在事务
true开启一个新事务
status = tm.getTransaction(txAttr)
存在外部事务抛出异常
数据源连接解绑
AutoProxyRegistrar.class
如果有必要则创建事务
catch{ 回滚事务}
设置只读和事务隔离级别
③ 配置advicetransactionInterceptor()
setConnectionHolder
② 配置事务属性源transactionAttributeSource()
registerAutoProxyCreatorIfNecessary
获取事务属性信息
txInfo = createTransactionIfNecessary
因为事务和AOP注册的bean后置处理器名字都叫 internalAutoProxyCreator所以会先判断是否已经注册过
注册
传播行为=NOT_SUPPORTED
try{ 责任链调用目标方法}
registerOrEscalateApcAsRequired
内部属性:connectionHolder=null,表示外层事务,否则为嵌套事务
con.setAutoCommit(false)
@Import({TransactionManagementConfigurationSelector.class})
invocation.proceed()
表示必须运行在事务中若当前没有事务就抛出异常
传播行为=NESTED
suspend(transaction)
doSuspend
findCandidateAdvisors()
prepareSynchronization
用来解析事务的切点是否命中,底层判断是否存在@Transactionalaop使用的是aspectj的切点表达式
...前面流程与Aop一样
将数据库连接包装成一个ConnectionHolder对象
开启事务
如果是挂起外部事务
构建缓存
责任链执行到目标方法,来到嵌套循环事务
放到缓存
嵌套方法开启新事务ConnectionHolder=null->新事务
true嵌套事务处理
isExistingTransaction
findAdvisorBeans
advisorNames=BeanFactoryUtils.beanNamesForTypeIncludingAncestors
注册过根据定义好的优先级覆盖。索引越大优先级越高
获取事务状态
selectImports
① 获取事务同步管理器属性值,先放到暂停资源持有器对象中② 同步管理器属性全部置空
ProxyTransactionManagementConfiguration.class
① 创建Advisor
setConnectionHolder(null)
unbindResource
解析Advisor
根据这个判断
throw new Exception
TransactionInterceptor#invoke
tas = getTransactionAttributeSource()
传播行为=REQUIRED
事务代理逻辑
责任链调用
事务信息全部绑定到同步管理器中的线程变量
txAttr =tas.getTransactionAttribute
AbstractAutoProxyCreator#postProcessBeforeInstantiation
获取已解析的事务属性源
挂起外部事务创建一个新的非事务状态
registry.containsBeanDefinition
handleExistingTransaction
0 条评论
回复 删除
下一页