Spring之事务底层源码解析
2022-10-15 15:21:50 0 举报
Spring事务
作者其他创作
大纲/内容
代理对象执行方法时
先匹配类
如果业务没有执行异常,那么则执行完finally方法才会进行提交事务
存在savepoint
把管理器强制转换为PlatformTransactionManager
回滚判断逻辑
拿到一个数据库连接(有可能为空)
创建动态代理,筛选Advisor方式
PROPAGATION_MANDATORY
TransactionInterceptor
globalRollbackOnParticipationFailure为true
TransactionAspectSupport#invokeWithinTransaction
AopUtils#findAdvisorsThatCanApply
触发同步器的BeforeCompletion方法
判断当前异常是否需要回滚
挂起1、调用TransactionSynchronization的suspend方法,并清空和返回当前线程中所有的TransactionSynchronization对象2、把transaction中的Connection清空,并把resources中的key-value进行移除,并返回数据库连接Connection对象3、获取并清空当前线程中关于TransactionSynchronizationManager的设置4、将当前线程中的数据库连接对象、TransactionSynchronization对象、TransactionSynchronizationManager中的设置构造成一个对象
TransactionAspectSupport#createTransactionIfNecessary
TransactionAttributeSourcePointcut.TransactionAttributeSourceClassFilter#matches
构造一个TransactionStatus
suspend把当前事务挂起,其中就会把数据库连接对象从ThreadLocal中移除,并返回SuspendedResourcesHolder对象
调用数据库连接的rollback();
dobegin子流程建立连接
事务创建动态代理跟AOP差不多,区别在匹配advisor的不同
工作原理
TransactionInterceptor#invoke
设置autocommit为false
ProxyTransactionManagementConfiguration
回滚事务子流程AbstractPlatformTransactionManager#processRollback
抛异常
判断当前类或方法上是否存在@Transactional
status.hasTransaction()//公用一个事务
PROPAGATION_NOT_SUPPORTED
事务调用流程
而InfrastructureAdvisorAutoProxyCreator继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理的作用,也就是一个BeanPostProcessor.会在初始化后步骤中去寻找Advisor类型的Bean,并判断当前某个Bean是否有匹配的Advisor,是否需要利用动态代理产生一个代理对象。
不持有,表示不存在事务
PROPAGATION_NESTED
判断事务传播机制
判断是否存在一个事务(是否存在数据库连接)
org.springframework.transaction.interceptor.RuleBasedTransactionAttribute#rollbackOn
触发同步器的afterCompletion方法
resources.get()
触发同步器的beforeCompletion方法
doBegin
doSetRollbackOnly(status);//设置为true
不需要
如果当前执行的方法是新开了一个事务,那么就直接回滚
AopUtils#canApply()
AutoProxyRegistrar
就把新创建的事务的一些状态信息设置到TransactionSynchronizationManager中
判断是否有事务挂起
执行
如果有则把挂起事务重新设置到TransactionSynchronizationManager中,并执行同步器的resume()
查看@Transactional是否指定了TransactionManager,如果没有指定,则获取TransactionManager类型的bean作为TransactionManager
设置数据库连接的过期时间
加了@Transactional注解的类或者有@Transaction注解方法的类都会生成代理对象的Bean
如果是新事物则会去关闭数据库连接
PROPAGATION_REQUIRED
创建事务流程
AnnotationTransactionAttributeSource
触发同步器的AfterCommit方法
0.不是public方法 直接返回null1.拿到最终的实现方法2.先检查实现方法上是否存在@Transactional3.再检查实现类上是否存在@Transactional4.实现方法和传进来的方法不相同,说明是接口方法4.判断接口方法上是否存在@Transactional5.再判断接口类上是否存在@Transactional
提交子流程
解析方法
AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
rollbackOnly为true
TransactionAttributeSourcePointcut
存在事务
JdkDynamicAopProxy#invoke
如果业务方法执行异常,就会进行回滚,然后会执行完finally方法才把异常抛出去
匹配方法
代理逻辑,当某个类中存在@Transactional注解时,到时就产生一个代理对象作为Bean,代理对象在执行某个方法时,最终就会进入到TransactionInterceptor的invoke()方法。
调用数据库连接的commit();
获取当前正在执行方法@Transactional注解中的属性值
cleanupAfterCompletion
@EnableTransactionManagement
相当于BeanFactoryTransactionAttributeSourceAdvisor中的Pointcut就是用来判断某个类上是否存在@Transactional注解,或者判断某个方法上是否存在@Transactional注解的。
得到一个新的DataSourceTransactionObject对象#设置setConnectionHolder
就是利用数据库连接,设置一个savepoint,后续可以只回滚到某个savepoint
status.rollbackToHeldSavepoint();
触发同步器的BeforeCommit方法
获得joinpoint的唯一标识,就是当前在执行的方法名字,作为事务的名字
PROPAGATION_NEVER
AbstractPlatformTransactionManager#getTransaction#得到一个TransactionStatus
如果是其他,则在当前事务执行
TransactionAttributeSourcePointcut#matches
根据@Transactional注解中的设置,设置Connection的readOnly与隔离级别
BeanFactoryTransactionAttributeSourceAdvisor
回滚到上一个savepoint位置
创建事务,并返回TransactionInfo
事务创建成功,并执行业务方法
InfrastructureAdvisorAutoProxyCreator
如果当前线程中所使用的DataSource还没有创建过数据库连接,就获取一个新的数据库连接,并设置到事务对象中
其他
如果一个事务中有两个方法,第二个方法抛异常了,那么第二个方法就相当于执行失败需要回滚,如果globalRollbackOnParticipationFailure为true,那么第一个方法在没有抛异常的情况下也要回滚
PROPAGATION_REQUIRES_NEW
添加两个bean
需要
0 条评论
下一页