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