Spring事务的代理逻辑源码分析
2023-08-23 11:30:07 9 举报
Spring事务的代理逻辑源码分析
作者其他创作
大纲/内容
invokeWithinTransaction
try{ 责任链调用目标方法}
是
JdkDynamicAopProxy#invoke
默认数据库的隔离级别
内部属性:connectionHolder=null,表示外层事务,否则为嵌套事务
获取事务对象
con.setAutoCommit(false)
invocation.proceed()
外部没有事务
表示必须运行在事务中若当前没有事务就抛出异常
传播行为=NESTED
suspend(transaction)
doSuspend
prepareSynchronization
ReflectiveMethodInvocation#proceed
doBegin
...前面流程与Aop一样
将数据库连接包装成一个ConnectionHolder对象
开启事务
如果是挂起外部事务
或者
责任链执行到目标方法,来到嵌套循环事务
transaction = doGetTransaction()
嵌套方法开启新事务ConnectionHolder=null->新事务
true嵌套事务处理
传播行为=REQUIRES_NEW
传播行为=NEVER
isExistingTransaction
获取事务状态
① 获取事务同步管理器属性值,先放到暂停资源持有器对象中② 同步管理器属性全部置空
开启新的事务
提交事务
发生异常
传播行为=MANDATORY
setConnectionHolder(null)
unbindResource
判断是否已存在事务
根据这个判断
true开启一个新事务
status = tm.getTransaction(txAttr)
throw new Exception
存在外部事务抛出异常
TransactionInterceptor#invoke
数据源连接解绑
tas = getTransactionAttributeSource()
如果有必要则创建事务
catch{ 回滚事务}
传播行为=REQUIRED
设置只读和事务隔离级别
setConnectionHolder
责任链调用
获取事务属性信息
事务信息全部绑定到同步管理器中的线程变量
txInfo = createTransactionIfNecessary
txAttr =tas.getTransactionAttribute
获取已解析的事务属性源
挂起外部事务创建一个新的非事务状态
handleExistingTransaction
传播行为=NOT_SUPPORTED
0 条评论
下一页