Spring 事务源码实现
2025-08-11 15:39:30 5 举报
AI智能生成
Spring事务源码实现
作者其他创作
大纲/内容
Spring事务处理进行AOP配置
TransactionProxyFactoryBean
Bean属性赋值,依赖注入
TransactionInterceptor transactionInterceptor = new TransactionInterceptor()
setTransactionManager(PlatformTransactionManager transactionManager)
setTransactionAttributes(Properties transactionAttributes)
setTransactionAttributeSource(TransactionAttributeSource transactionAttributeSource)
bean初始化,通过initializeBean方法被调用invokeInitMethods->afterPropertiesSet
AbstractSingletonProxyFactoryBean#afterPropertiesSet
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.addAdvisor(advisor)
Advisor advisor = TransactionProxyFactoryBean#createMainInterceptor
transactionInterceptor.afterPropertiesSet()
TransactionAspectSupport#afterPropertiesSet
检查TransactionManager,beanFactory,TransactionAttributeSource是否为空,为空则抛出异常IllegalStateException
this.pointcut != null
new DefaultPointcutAdvisor((this.pointcut, this.transactionInterceptor))
this.pointcut = null
new TransactionAttributeSourceAdvisor(this.transactionInterceptor)
new TransactionAttributeSourcePointcut.getTransactionAttributeSource
TransactionAspectSupport#getTransactionAttributeSource
proxyFactory.setTargetSource(targetSource);
AbstractSingletonProxyFactoryBean#createTargetSource
proxyFactory.setInterfaces(Class<?>[])
ClassUtils#getAllInterfacesForClass
ProxyFactory#getProxy
事务处理拦截器的设计与实现
TransactionAttributeSourcePointcut#matches
TransactionAttributeSource tas = this.getTransactionAttributeSource();
TransactionAspectSupport#setTransactionAttributes
NameMatchTransactionAttributeSource tas = new NameMatchTransactionAttributeSource();
NameMatchTransactionAttributeSource#setProperties
TransactionAttributeEditor tae = new TransactionAttributeEditor();
Enumeration<?> propNames = transactionAttributes.propertyNames();
NameMatchTransactionAttributeSource#addTransactionalMethod(methodName, attr)
Map<String, TransactionAttribute> nameMap.put(methodName, attr)
tas.setProperties(transactionAttributes);
NameMatchTransactionAttributeSource#getTransactionAttribute(method, targetClass)
this.nameMap.get(methodName)
NameMatchTransactionAttributeSource#isMatch(methodName, mappedName)
PatternMatchUtils#simpleMatch(mappedName, methodName)
TransactionInterceptor#invoke
targetClass
TransactionAspectSupport#invokeWithinTransaction
TransactionAspectSupport#getTransactionAttributeSource
NameMatchTransactionAttributeSource#getTransactionAttribute
NameMatchTransactionAttributeSource#getTransactionAttribute
TransactionManager tm = TransactionAspectSupport#determineTransactionManager
String qualifier = txAttr.getQualifier();
TransactionAspectSupport#determineQualifiedTransactionManager(this.beanFactory, qualifier)
transactionManagerBeanName
determineQualifiedTransactionManager(this.beanFactory, this.transactionManagerBeanName)
defaultTransactionManager
tm instanceof ReactiveTransactionManager
tm instanceof PlatformTransactionManager
ptm instanceof CallbackPreferringPlatformTransactionManager
TransactionAspectSupport#prepareTransactionInfo
invocation.proceedWithInvocation();
TransactionAspectSupport#invokeWithinTransaction
RuntimeException会导致事务回滚
正常的返回,导致事务提交
TransactionAspectSupport#cleanupTransactionInfo
TransactionAspectSupport.TransactionInfo#restoreThreadLocalStatus
TransactionAspectSupport.transactionInfoHolder.set(this.oldTransactionInfo);
else
声明式事务创建的入口
TransactionAspectSupport#createTransactionIfNecessary
status = tm.getTransaction((TransactionDefinition)txAttr);
AbstractPlatformTransactionManager#getTransaction
Object transaction = this.doGetTransaction()
CciLocalTransactionManager#doGetTransaction
DataSourceTransactionManager#doGetTransaction
DataSourceTransactionObject txObject = new DataSourceTransactionObject();
txObject.setSavepointAllowed(this.isNestedTransactionAllowed());
ConnectionHolder conHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(this.obtainDataSource());
txObject.setConnectionHolder(conHolder, false);
txObject.setConnectionHolder(conHolder, false);
JtaTransactionManager#doGetTransaction
DataSourceTransactionManager#isExistingTransaction
transaction.getConnectionHolder().isTransactionActive()
AbstractPlatformTransactionManager#handleExistingTransaction
int PROPAGATION_NEVER = 5;
定义:以非事务方式执行,如果存在事务,则抛出异常。
原理:方法不应该在任何事务中执行。
定义:以非事务方式执行,如果存在事务,则抛出异常。
原理:方法不应该在任何事务中执行。
IllegalTransactionStateException("Existing transaction found for transaction marked with propagation 'never'")
int PROPAGATION_NOT_SUPPORTED = 4;
定义:以非事务方式执行操作,如果存在事务,就将其挂起。
原理:方法不支持事务,即使调用者有事务,也不会参与。
AbstractPlatformTransactionManager#suspend
SYNCHRONIZATION_ALWAYS = 0;
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
AbstractPlatformTransactionManager#prepareTransactionStatus
int PROPAGATION_REQUIRES_NEW = 3;
定义:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
原理:需要独立提交或回滚的子操作,适用于日志记录等场景。
AbstractPlatformTransactionManager#suspend
AbstractPlatformTransactionManager#startTransaction
int PROPAGATION_NESTED = 6;
定义:如果存在事务,则在嵌套事务内执行;否则,类似于 REQUIRED。
原理:基于底层数据库的保存点(savepoint),允许在嵌套事务中回滚到保存点,而不影响外部事务。
useSavepointForNestedTransaction
AbstractPlatformTransactionManager#prepareTransactionStatus
AbstractTransactionStatus#createAndHoldSavepoint
AbstractTransactionStatus#setSavepoint
AbstractPlatformTransactionManager#startTransaction
int PROPAGATION_REQUIRED = 0;(默认)
定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。
int PROPAGATION_SUPPORTS = 1;
定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。
原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。
int PROPAGATION_MANDATORY = 2
定义:支持当前事务,必须存在一个事务,否则抛出异常。
原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。
int PROPAGATION_SUPPORTS = 1;
定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。
原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。
int PROPAGATION_MANDATORY = 2
定义:支持当前事务,必须存在一个事务,否则抛出异常。
原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
AbstractPlatformTransactionManager#isValidateExistingTransaction
SYNCHRONIZATION_ALWAYS (值为 0)
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
SYNCHRONIZATION_ON_ACTUAL_TRANSACTION (值为 1)
含义:只有在存在实际事务时才注册事务同步。
用途:这是最常见的事务同步行为,确保同步逻辑只在真正的事务上下文中执行。
示例:在大多数业务逻辑中,你希望事务同步逻辑(如提交后的处理)只在事务实际提交时执行。
AbstractPlatformTransactionManager#prepareTransactionStatus
int PROPAGATION_MANDATORY = 2
定义:支持当前事务,必须存在一个事务,否则抛出异常。
原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
定义:支持当前事务,必须存在一个事务,否则抛出异常。
原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'")
int PROPAGATION_SUPPORTS = 1;
定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。
原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。
int PROPAGATION_NOT_SUPPORTED = 4;
定义:以非事务方式执行操作,如果存在事务,就将其挂起。
原理:方法不支持事务,即使调用者有事务,也不会参与。
int PROPAGATION_NEVER = 5;
定义:以非事务方式执行,如果存在事务,则抛出异常。
原理:方法不应该在任何事务中执行。
定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。
原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。
int PROPAGATION_NOT_SUPPORTED = 4;
定义:以非事务方式执行操作,如果存在事务,就将其挂起。
原理:方法不支持事务,即使调用者有事务,也不会参与。
int PROPAGATION_NEVER = 5;
定义:以非事务方式执行,如果存在事务,则抛出异常。
原理:方法不应该在任何事务中执行。
SYNCHRONIZATION_ALWAYS = 0;
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
AbstractPlatformTransactionManager#prepareTransactionStatus
AbstractPlatformTransactionManager#newTransactionStatus
AbstractPlatformTransactionManager#prepareSynchronization
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(definition.getIsolationLevel() != -1 ? definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(definition.getIsolationLevel() != -1 ? definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
int PROPAGATION_REQUIRED = 0;(默认)
定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。
int PROPAGATION_REQUIRES_NEW = 3;
定义:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
原理:需要独立提交或回滚的子操作,适用于日志记录等场景。
int PROPAGATION_NESTED = 6;
定义:如果存在事务,则在嵌套事务内执行;否则,类似于 REQUIRED。
原理:基于底层数据库的保存点(savepoint),允许在嵌套事务中回滚到保存点,而不影响外部事务。
定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。
int PROPAGATION_REQUIRES_NEW = 3;
定义:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
原理:需要独立提交或回滚的子操作,适用于日志记录等场景。
int PROPAGATION_NESTED = 6;
定义:如果存在事务,则在嵌套事务内执行;否则,类似于 REQUIRED。
原理:基于底层数据库的保存点(savepoint),允许在嵌套事务中回滚到保存点,而不影响外部事务。
事务挂起
AbstractPlatformTransactionManager#suspend
TransactionSynchronizationManager#isSynchronizationActive
DataSourceTransactionManager#doSuspend
txObject.setConnectionHolder((ConnectionHolder)null)
TransactionSynchronizationManager#unbindResource
return new SuspendedResourcesHolder
catch (Error | RuntimeException var8)
AbstractPlatformTransactionManager#doResumeSynchronization
AbstractPlatformTransactionManager#startTransaction
SYNCHRONIZATION_ALWAYS (值为 0)
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
SYNCHRONIZATION_ON_ACTUAL_TRANSACTION (值为 1)
含义:只有在存在实际事务时才注册事务同步。
用途:这是最常见的事务同步行为,确保同步逻辑只在真正的事务上下文中执行。
示例:在大多数业务逻辑中,你希望事务同步逻辑(如提交后的处理)只在事务实际提交时执行。
AbstractPlatformTransactionManager#newTransactionStatus
newSynchronization && !TransactionSynchronizationManager.isSynchronizationActive()
return DefaultTransactionStatus#DefaultTransactionStatus
this.transaction = transaction;
this.newTransaction = newTransaction;
this.newSynchronization = newSynchronization;
this.readOnly = readOnly;
this.debug = debug;
this.suspendedResources = suspendedResources;
DataSourceTransactionManager#doBegin
Connection newCon = this.obtainDataSource().getConnection();
txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
设置事务状态
ransactionSynchronizationManager#bindResource
DataSourceUtils#releaseConnection
DataSourceUtils#doReleaseConnection
DataSourceUtils#doCloseConnection
Connection.close()
AbstractPlatformTransactionManager#prepareSynchronization
TransactionAspectSupport#prepareTransactionInfo(tm, (TransactionAttribute)txAttr, joinpointIdentification, status)
TransactionInfo txInfo = new TransactionInfo(tm, txAttr, joinpointIdentification);
txInfo.newTransactionStatus(status);
TransactionAspectSupport.TransactionInfo#bindToThread
ThreadLocal<TransactionInfo> transactionInfoHolder = new NamedThreadLocal("Current aspect-driven transaction");
transactionInfoHolder.set(this);
invocation.proceedWithInvocation()
TransactionAspectSupport#invokeWithinTransaction
TransactionAspectSupport#completeTransactionAfterThrowing
txInfo.transactionAttribute.rollbackOn(ex)
AbstractPlatformTransactionManager#rollback(transactionStatus)
else
AbstractPlatformTransactionManager#commit(transactionStatus)
TransactionAspectSupport#cleanupTransactionInfo
TransactionAspectSupport.TransactionInfo#restoreThreadLocalStatus
TransactionAspectSupport.transactionInfoHolder.set(this.oldTransactionInfo);
事务提交
TransactionAspectSupport#commitTransactionAfterReturning
AbstractPlatformTransactionManager#commit(transactionStatus)
事务回滚
AbstractPlatformTransactionManager#processRollback
AbstractPlatformTransactionManager#triggerBeforeCompletion
TransactionSynchronizationUtils#triggerBeforeCompletion
TransactionSynchronization.beforeCompletion()
AbstractTransactionStatus#releaseHeldSavepoint
AbstractTransactionStatus#releaseSavepoint
DataSourceTransactionManager#doRollback
status.getTransaction().getConnectionHolder().getConnection().rollback()
AbstractPlatformTransactionManager#doSetRollbackOnly
status.getTransaction().setRollbackOnly()
AbstractPlatformTransactionManager#triggerAfterCompletion
AbstractPlatformTransactionManager#invokeAfterCompletion
TransactionSynchronizationUtils#invokeAfterCompletion
TransactionSynchronization.afterCompletion(completionStatus);
AbstractPlatformTransactionManager#cleanupAfterCompletion
status.setCompleted()
TransactionSynchronizationManager#clear
currentTransactionName.remove();
synchronizations.remove();
currentTransactionReadOnly.remove();
currentTransactionIsolationLevel.remove();
actualTransactionActive.remove();
DataSourceTransactionManager#doCleanupAfterCompletion
AbstractPlatformTransactionManager#resume
AbstractPlatformTransactionManager#processCommit
this.prepareForCommit(status);
this.triggerBeforeCommit(status);
this.triggerBeforeCompletion(status);
this.triggerBeforeCommit(status);
this.triggerBeforeCompletion(status);
AbstractTransactionStatus#releaseHeldSavepoint
AbstractTransactionStatus#releaseSavepoint
DataSourceTransactionManager#doCommit
status.getTransaction().getConnectionHolder().getConnection().commit()
AbstractPlatformTransactionManager#triggerAfterCommit
TransactionSynchronizationUtils#triggerAfterCommit
TransactionSynchronizationUtils#invokeAfterCommit
TransactionSynchronization.afterCommit()
AbstractPlatformTransactionManager#triggerAfterCompletion
AbstractPlatformTransactionManager#invokeAfterCompletion
TransactionSynchronizationUtils#invokeAfterCompletion
TransactionSynchronization.afterCompletion(completionStatus);
AbstractPlatformTransactionManager#doRollbackOnCommitException
NewTransaction()
this.doRollback(status)
this.doSetRollbackOnly(status)
AbstractPlatformTransactionManager#triggerAfterCompletion
AbstractPlatformTransactionManager#cleanupAfterCompletion
status.setCompleted()
TransactionSynchronizationManager#clear
currentTransactionName.remove();
synchronizations.remove();
currentTransactionReadOnly.remove();
currentTransactionIsolationLevel.remove();
actualTransactionActive.remove();
DataSourceTransactionManager#doCleanupAfterCompletion
AbstractPlatformTransactionManager#resume
Spring事务处理的设计与实现
事务处理的编程式使用
事务处理的声明式使用
Spring事务中重要的对象
TransactionInfo
TransactionStatus
0 条评论
下一页