Spring事务流程
2021-04-25 18:23:17 12 举报
Spring事务流程
作者其他创作
大纲/内容
第一步:通过事务管理器获取事务状态对象
ReflectiveMethodInvocation
获取事务属性
抛出异常
prepareTransactionInfo
invocation.proceedWithInvocation()调用目标对象
获取方法上的拦截器链getInterceptorsAndDynamicInterceptionAdvice
JdkDynamicAopProxy#invoke
我们在创建代理对象的时候,我们放放过
缓存中有
DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice
userService.save(user)
第二步
prepareTransactionStatus
interceptorOrInterceptionAdvice是否实现了接口:InterceptorAndDynamicMethodMatcher
返回事务状态
Y:通过反射直接调用
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
suspend(null)
Y
检查事务超时设置
获取方法切点描述符号
PROPAGATION_MANDATORY
tm.getTransaction(txAttr)
chain.isEmpty()
判断当前是否存在事务?
去缓存中获取拦截器链
\"地瓜哥\"博客网 · https://www.diguage.com · 出品
直接返回方法调用器链
currentInterceptorIndex前++(索引值:0)
返回一个新运行事务的状态,包含前一个事务的状态
N
开启一个事务
判断是否为这三种:PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_NESTED
status.createAndHoldSavepoint()
挂起当前事务suspend(transaction)
txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
第二步:拿到第一步的事务状态结构,准备事务信息,事务信息 TransactionInfo 封装了事务配置和??
有,走 catch 代码块,回滚
invocation.proceed()
事务状态设置保存点
提交
回滚
判断事务传播行为是否为:PROPAGATION_REQUIRES_NEW
挂起的事务保存到:DefaultTransactionStatus
判断执行过程中是否有异常
invokeWithinTransaction
创建空事务,针对supported类型的事务传播特性,激活和当前线程绑定的事务
commitTransactionAfterReturning
调用前进行一系列的判断
判断事务传播行为是否为:PROPAGATION_NESTED
处理:PROPAGATION_SUPPORTSor:PROPAGATION_REQUIRED
进行事务处理逻辑判断handleExistingTransaction
doBegin
根据advised.exposeProxy判断是否需要暴露代理对象
\"地瓜哥\"博客网 · https://www.diguage.com · 出品
Object transaction = doGetTransaction();
((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this)
JTA处理嵌套事务
createTransactionIfNecessary
返回一个非运行事务的状态,包含了前一个事务的状态
创建事务有必要
判断事务传播行为是否为:PROPAGATION_NEVER
判断事务传播行为是否为:PROPAGATION_NOT_SUPPORTED
判断是否运行嵌套事务
newTransactionStatus()
(TransactionInterceptor 类型)
determineTransactionManager(txAttr)
prepareTransactionStatus()
第一步
初始化和同步事务状态prepareSynchronization
this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1
根据事务定义,事务对象创建事务状态
缓存中没有
isExistingTransaction
判断是否为要回滚的异常
创建反射的方法调用对象
useSavepointForNestedTransaction()
收藏
收藏
0 条评论
下一页