Spring 事务
2022-09-12 22:17:42 0 举报
AI智能生成
登录查看完整内容
Spring 事务源码分析
作者其他创作
大纲/内容
注册 InfrastructureAdvisorAutoProxyCreator
AutoProxyRegistrar
相当于 Advisor
BeanFactoryTransactionAttributeSourceAdvisor
匹配类判断类上有没有 @Transactional
匹配方法解析方法上的 @Transactional 注解,得到 RuleBasedTransactionAttribute
相当于 Pointcut将 AnnotationTransactionAttributeSource 封装到 TransactionAttributeSourcePointcut用来解析 @Transaction 注解,并得到一个 RuleBasedTransactionAttribute
AnnotationTransactionAttributeSource
得到事务对象 DatasourceTransactionObjectconn 可能为空
判断是否超时,超时抛出异常
抛出异常
PROPAGATION_MANDATORY
判断是否开启过事务
调用 TransactionSynchronization 的 suspend 方法,并清空和返回当前线程中所有的 TransactionSynchronization 对象
doSuspend()把 transaction 中的 connection 清空,并把 resource 中的 key-value 进行移除,并返回数据库连接 Connection 对象
获取并清空当前线程中关于 TransactionSynchronizationManager 的设置
将当前线程中的数据库连接对象、TransactionSynchronization对象、TransactionSynchronizationManager 中的设置构造一个资源挂起对象
挂起事务suspend()
持有前面事务的挂起对象 SuspendedResourcesHolder
构造 TransactionStatus
获取数据库连接
设置 ReadOnly 属性
设置隔离级别
设置数据库连接的 autoCommit 为 false
把新建的数据库连接通过 TransactionSynchronizationManager 设置到当前线程的 ThreadLocal 中
开启事务 doBegin
将事务信息设置到 TransactionSynchronizationManagerprepareSynchronization()
PROPAGATION_REQUIRES_NEW | PROPAGATION_REQUIRED | PROPAGATION_NESTED
将事务信息设置到 TransactionSynchronizationManager
构造 TransactionStatus但不包含事务对象,也不会建立连接
其他
判断传播机制
不持有当前线程不存在事务
报错
PROPAGATION_NEVER
构造并返回 TransactionStatus 对象,其中包含了 suspendedResources,并且更新了 TransactionSynchronizationManager
PROPAGATION_NOT_SUPPORTED
持有前面事务的挂起对象 SuspendedResources
PROPAGATION_REQUIRES_NEW
利用数据库连接,设置一个 savePoint
PROPAGATION_NESTED
当前事务中旬·运行
持有当前线程存在事务
判断事务是否持有数据库连接
开启事务 得到 TransactionStatus
将 TransactionStatus 构造进 TransactionInfo,并放入 ThreadLocal其中持有挂起对象
创建事务
执行下一个 Interceptor 或被代理对象中的方法
匹配设置的 RollbackRuleAttribute
如果没匹配到则匹配父类规则
执行回调 synchronization.beforeCompletion();
如果有 Savepoint,回滚到上一个 Savepoint
如果是自己创建的事务,则进行回滚
如果不是自己创建的,设置全局回滚
执行回调 synchronization.afterCompletion(completionStatus)
执行 cleanupAfterCompletion()
需要回滚
调用 commit()提交
不需要回滚
如果匹配到了则匹配 则进行匹配 NoRollbackRuleAttribute
判断是否需要回滚
出现异常,回滚事务
判断是否设置了强制回滚
判断此事务在之前是否标记了了需要回滚 GlobalRollbackOnParticipationFailure
执行 synchronization.beforeCommit()
执行 synchronization.beforeCompletion();
doCommit() 提交事务
如果是新新创建的事务(当前线程自己创建的)
执行回调 synchronization.afterCommit();
执行回调 synchronization.afterCompletion()
如果是自己创建的连接则 从 ThreadLocal 中移除当前连接
关闭手动提交
恢复隔离级别、ReadOnly属性
关闭数据库连接
将连接放入 ThreadLocal
恢复 TransactionSynchronization
恢复被挂起的事务
cleanupAfterCompletion()
提交事务
没有异常,提交事务
执行代理逻辑
TransactionInterceptor相当于 Advice
ProxyTransactionManagementConfiguration
TransactionManagementConfigurationSelector
@EnableTransactionManagement
Spring 事务
0 条评论
回复 删除
下一页