Spring 事务流程解析
2021-04-12 13:35:27 1 举报
Spring 事务流程解析
作者其他创作
大纲/内容
doGetTransaction
是否是声明式事务(注解)
EnableTransactionManagement
返回
PROPAGATION_REQUIRED
status DefaultTransactionStatus
tm
DefaultTransactionStatus
获取注解属性
commitTransactionAfterReturning(txInfo)提交事务
N
AutoProxyRegistrar
属性:Connection
TransactionAttribute
processRollback
存在事务已经开启的情况
TransactionInterceptor
else
属性:ConnectionHolder
这个地方的tm,可以是默认的,也可能是JTA默认:AbstractPlatformTransactionManagerJTA : JtaTransactionManager
invoke
con.rollback()
String
https://www.cnblogs.com/dennyzhangdd/p/9602673.html
如果ThreadLocal中没有connection,则通过dataSource创建,然后放入ThreadLocal
TransactionSynchronizationManager#
如果当前已经存在Connection
PROPAGATION_NEVER
finally
applyBeanPostProcessorsAfterInitialization
txAttr
TransactionAttributeSource
加载两个类
支持当前事务,如果不存在,就不使用事务
事务通知模式(切面织入方式) ,默认代理模式(同一个类中方法互相调用拦截器不会生效),可以选择增强型AspectJ
getTransactionAttribute
嵌套事务:外层事务回滚、内层的也会回滚,但是内层的事务如果回滚,外层不受影响,只回滚内层事务代码
applyBeanPostProcessorsBeforeInitialization
if
1
proceed()
往后得情况都是不存在事务
transactionAttribute
getTransaction
postProcessAfterInitialization
PlatformTransactionManager
TransactionInfo
doGetResource
ASPECTJ
findTransactionAttribute :第一步:试图从实现类上获取属性
joinpointIdentification
tas
JdbcTransactionObjectSupport
DataSourceTransactionManager#
PROPAGATION_NESTED
继承
开启事务
findTransactionAttribute :如果以上都没获取到属性,则从接口中获取参数属性
2
以非事务方式运行,如果有事务存在,挂起当前事务
判断当前的事务类型是否为“描述的这个”
transactionManager
是否执行成功
PROPAGATION_NOT_SUPPORTED
暂未理解
继承
boolean proxyTargetClass() default false;
BeanFactoryTransactionAttributeSourceAdvisor
给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;
/** * 创建用户并创建账户余额(手动事务,不带结果)font color=\"#a1a1a1\
transaction
handleExistingTransaction
BeanPostProcessor
PROPAGATION_REQUIRES_NEW
必须被一个开启了事务的方法来调用自己,否则报错
重要
bean 在实例化之后,也就是调用 populateBean 之后,会调用AbstractAutowireCapableBeanFactory#initializeBean
后面的流程就是方法执行成功还是失败,直接就走 connetion的提交或者回滚
里面会有几种判断,然后会调用rollback
false表示是JDK动态代理支持接口代理 ,true表示是Cglib代理支持子类继承代理。
根据不同传播机制不同处理
AbstractAutowireCapableBeanFactory# applyBeanPostProcessorsAfterInitialization
从ThreadLocal中获取对应的Connection
AdviceMode
AbstractAutoProxyCreator
con.commit()
AbstractPlatformTransactionManager 子类
所以包含了主要了几个属性
支持当前事务,如果不存在就新建一个
int order() default Ordered.LOWEST_PRECEDENCE
实现嵌套事务两种方式
暂时没看
throw new Exception
JdkDynamicAopProxy
以非事务方式运行,如果有事务存在,抛出异常
DataSourceTransactionManagerisExistingTransaction(transaction)
doCommit(status)
注解式得事务
JtaTransactionManager
//此方法就是为了获取 ConnectionHolder ,里面有connectfont color=\"#a1a1a1\
ProxyTransactionManagementConfiguration
DataSourceTransactionObject
连接点上有多个通知时,排序,默认最低。值越大优先级越低。
resourcesThreadLocal,实际上这里存储的是ConnectionHolder,数据库的链接信息
默认:DataSourceTransactionManager如果TransactionManager是JTA : JtaTransactionManagerbegin 对应不同的实现
tm
AbstractPlatformTransactionManagerstatus = tm.getTransaction(txAttr)
@Import
如果ThreadLocal中没有connection,后面的方法则通过dataSource创建,然后放入ThreadLocal
A 调用 B,这时候A已经开启了事务
关闭会话、释放链接清空ThreadLocal得Map信息cleanupAfterCompletion(status)
bindResource
1、设置Connection的自动提交为手动提交con.setAutoCommit(false)2、设置Connection的超时时间 txObject.getConnectionHolder().setTimeoutInSeconds(timeout)
暂时留白
AdviceMode mode() default AdviceMode.PROXY
TransactionAspectSupport#invokeWithinTransaction()
如果有事务存在,挂起当前事务,创建一个新的事务,出问题只回滚自己。强制性自己开启一个新的事务
事务切面解
获取是: @Transactional(transactionManager = \"xatx\
createTransactionIfNecessary
getAdvicesAndAdvisorsForBean:获取切面 获取的过程是一个非常复杂的过程
创建代理类的核心方法
catch
ReflectiveMethodInvocationretVal = invocation.proceed()
implements
Y
PROPAGATION_SUPPORTS
AnnotationTransactionAttributeSource
返回:DataSourceTransactionObject参数名:transaction
保存点相关,暂未理解
实现
就是一个配置类,定义了事务增强器
返回值
// song-s 这里进行方法的调用MethodInterceptor ,也就是TransactionInterceptor // MethodInterceptor 得子类是 TransactionInterceptor return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
检查是否已经超时
获取连接以及注解属性信息
PROXY
getResource
DefaultTransactionStatus属性 transaction
创建连接 Connectionthis.dataSource.getConnection()
postProcessBeforeInitialization
事务拦截器BeanDefinition 对象
如果上面都没走,这里一定会走
将 创建的connection信息,放入到threadLocak中 280行
TransactionAttributeSource
TransactionStatus
cleanupTransactionInfo(txInfo)清空事务信息
// @Transactional 事务注解解析器
InitializingBean
throw Exception
AbstractAutoProxyCreator# wrapIfNecessary
processCommit
PROPAGATION_MANDATORY
createProxy :创建代理对象默认的情况下会使用 JDK 的动态代理接口创建代理对象
PROPAGATION_NEVER
Connection
transactionStatus
DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction(); Connection con = txObject.getConnectionHolder().getConnection();con.rollback()con.commit()
findTransactionAttribute :第一步:试图从方法上获取属性
suspend
AbstractFallbackTransactionAttributeSource
(TransactionManagementConfigurationSelector.class)
成功
computeTransactionAttribute
0 条评论
下一页