Spring源码-15-Spring之事务源码解析
2021-11-20 17:41:41 12 举报
Spring事务源码解析
作者其他创作
大纲/内容
processCommit(defStatus);
@EnableTransactionManagement
triggerAfterCompletion()
doBegin()
@Transactionalpublic void test(){ jdbcTemplate.execute(\
SuspendedResourcesHolder suspendedResources = suspend(null);//suspendedResources表示当前线程被挂起的资源持有对象(数据库连接、TransactionSynchronization)
判断要不要回滚
true
向Spring中注册了两个类
PROPAGATION_NESTED
if (defStatus.isLocalRollbackOnly())////强制回滚
向Spring中添加了3个bean
con.rollback();
triggerBeforeCommit(status);
在这个里面会设置为true
把transaction中的Connection清空,并把resources中的key-value进行移除,并返回数据库连接Connection对象
//TransactionSynchronizationManager调用提交前的方法
if(status.isNewTransaction()){doCommit(status);}
false.没有事务
拿到DataSourceTransactionObject
TransactionManager tm = determineTransactionManager(txAttr);//返回Spring容器中类型为TransactionManager对象
Connection newCon = obtainDataSource().getConnection();//创建一个连接
TransactionAttributeSource tas = getTransactionAttributeSource();//获取到工具类
false
doSetRollbackOnly(status);
源码
retVal = invocation.proceedWithInvocation();//执行下一个Interceptor或被代理对象中的方法
Object transaction = doGetTransaction();//拿到一个新的DataSourceTransactionObject
status = tm.getTransaction(txAttr);//txAttr就是@Transactional的注解信息//status是挂起的资源对象
判断接力级别是不是PROPAGATION_MANDATORY
if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly())
triggerBeforeCompletion(status);
triggerAfterCommit(statustriggerAfterCommit(status););
if (status.isNewTransaction())
if (status.hasSavepoint())
if (status.getSuspendedResources() != null)
cleanupAfterCompletion(status);// 恢复被挂起的资源到当前线程中
隔离级别是不是以下3种情况在没有事务得情况下,以下3个是等价得
一个Advisor
事务失效
transactionInfoHolder.set(this);//把挂起的资源对象设置到ThreadLocal
ProxyTransactionManagementConfiguration
for循环遍历rollbackRules,找其父类,看是属于RollbackRuleAttribute还是NoRollbackRuleAttribute
在提交的时候,就会回滚
@Transactional\tpublic void test(){\t\tString currentTransactionName = TransactionSynchronizationManager.getCurrentTransactionName();\t\tTransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {\t\t\t@Override\t\t\tpublic void suspend() {\t\t\t}\t\t\t@Override\t\t\tpublic void resume() {\t\t\t}\t\t\t@Override\t\t\tpublic void beforeCommit(boolean readOnly) {\t\t\t}\t\t\t@Override\t\t\tpublic void afterCommit() {\t\t\t}\t\t});\t\tSystem.out.println(\"当前事务得名字:\"+currentTransactionName);\t\tjdbcTemplate.execute(\
TransactionInterceptor
相当于BeanFactoryTransactionAttributeSourceAdvisor中的Pointcut 就是用来判断某个类上是否存在@Transactional注解,或者判断某个方法上是否存在@Transactional注解的。
TransactionSynchronizationManager.getResource(obtainDataSource());//在ThreadLocal中根据dataSource拿到一个连接对象
@Componentpublic class UserService {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredOrderService orderService;@Transactionalpublic void test(){ jdbcTemplate.execute(\
if (TransactionSynchronizationManager.isSynchronizationActive())//表示有没有过事务,一开始默认是false得
封装成对象SuspendedResourcesHolder(挂起其实就是保留现场)
获取到连接,把@Transactional里面得readOnly和隔离级别,超时时间,autocommit=false设置到连接里面
InfrastructureAdvisorAutoProxyCreator的Bean。 而InfrastructureAdvisorAutoProxyCreator 继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理的作用,也 就是一个BeanPostProcessor,会在初始化后步骤中去寻找Advisor类型的Bean,并判断当前某个 Bean是否有匹配的Advisor,是否需要利用动态代理产生一个代理对象。
/*\t\t* try {\t\t\tthrow new NullPointerException();\t\t}catch (Exception e){\t\t\tTransactionAspectSupport.currentTransactionStatus().setRollbackOnly();\t\t\treturn new Result();\t\t}*/
判断是否有连接
//这里会去关闭数据库连接\t\t\tdoCleanupAfterCompletion(status.getTransaction());
回滚到SavePoint
PROPAGATION_REQUIRED
suspendedResources = doSuspend(transaction);
con.commit();
如果存在事务,那就需要挂起
commitTransactionAfterReturning(txInfo);//提交
//1.每次都会创建一个DataSourceTransactionObject
进入到TransactionInterceptor的invoke()
doRollback(status);
rollbackOn(Throwable ex);
if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure())
AnnotationTransactionAttributeSource
PROPAGATION_REQUIRES_NEW
相当于BeanFactoryTransactionAttributeSourceAdvisor中的 Advice TransactionInterceptor就是代理逻辑,当某个类中存在@Transactional注解时,到时就产生一个代理对象作为Bean,代理对象在执行某个方法时,最终就会进入到TransactionInterceptor的invoke()方法。
判断超时
AutoProxyRegistrar
归滚的逻辑
事务回滚
BeanFactoryTransactionAttributeSourceAdvisor
干预挂起,恢复等过程
向Spring注册InfrastructureAdvisorAutoProxyCreator//添加了beanPostProcessor
txInfo.bindToThread();
获取并清空当前线程中关于TransactionSynchronizationManager的设置
加了@Transactional注解,test()方法中的execute()中的sql语句,都在一个事务中执行,那么@Transaction一定是在方法前后加了某个逻辑,这不就是Aop嘛
都不会插进去,用的是同一个连接,a()方法的事务会添加到test()方法的事务里面去
0 条评论
下一页