Object transaction = this.doGetTransaction()
CciLocalTransactionManager#doGetTransaction
DataSourceTransactionManager#doGetTransaction
DataSourceTransactionObject txObject = new DataSourceTransactionObject();
txObject.setSavepointAllowed(this.isNestedTransactionAllowed());<br>
ConnectionHolder conHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(this.obtainDataSource());<br>txObject.setConnectionHolder(conHolder, false);
JtaTransactionManager#doGetTransaction
DataSourceTransactionManager#isExistingTransaction
transaction.getConnectionHolder().isTransactionActive()
AbstractPlatformTransactionManager#handleExistingTransaction
int PROPAGATION_NEVER = 5;<br>定义:以非事务方式执行,如果存在事务,则抛出异常。<br>原理:方法不应该在任何事务中执行。
IllegalTransactionStateException("Existing transaction found for transaction marked with propagation 'never'")
int PROPAGATION_NOT_SUPPORTED = 4;
定义:以非事务方式执行操作,如果存在事务,就将其挂起。
原理:方法不支持事务,即使调用者有事务,也不会参与。
AbstractPlatformTransactionManager#suspend
SYNCHRONIZATION_ALWAYS = 0;<br>含义:无论事务是否实际存在,总是注册事务同步。<br>用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。<br>示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
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;(默认)<br>定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。<br>原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。<br>int PROPAGATION_SUPPORTS = 1;<br>定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。<br>原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。<br>int PROPAGATION_MANDATORY = 2<br>定义:支持当前事务,必须存在一个事务,否则抛出异常。<br>原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
AbstractPlatformTransactionManager#isValidateExistingTransaction
SYNCHRONIZATION_ALWAYS (值为 0)
含义:无论事务是否实际存在,总是注册事务同步。
用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。
示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
SYNCHRONIZATION_ON_ACTUAL_TRANSACTION (值为 1)
含义:只有在存在实际事务时才注册事务同步。
用途:这是最常见的事务同步行为,确保同步逻辑只在真正的事务上下文中执行。
示例:在大多数业务逻辑中,你希望事务同步逻辑(如提交后的处理)只在事务实际提交时执行。
AbstractPlatformTransactionManager#prepareTransactionStatus
int PROPAGATION_MANDATORY = 2<br>定义:支持当前事务,必须存在一个事务,否则抛出异常。<br>原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。
IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'")<br>
int PROPAGATION_SUPPORTS = 1;<br>定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。<br>原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。<br>int PROPAGATION_NOT_SUPPORTED = 4;<br>定义:以非事务方式执行操作,如果存在事务,就将其挂起。<br>原理:方法不支持事务,即使调用者有事务,也不会参与。<br>int PROPAGATION_NEVER = 5;<br>定义:以非事务方式执行,如果存在事务,则抛出异常。<br>原理:方法不应该在任何事务中执行。
SYNCHRONIZATION_ALWAYS = 0;<br>含义:无论事务是否实际存在,总是注册事务同步。<br>用途:适用于需要在事务上下文中始终执行某些同步逻辑的场景,即使当前没有实际的事务(例如,在某些嵌套调用或特殊的事务传播行为下)。<br>示例:在某些情况下,你可能希望确保某些清理操作或资源释放逻辑总是被执行,即使事务被标记为“只读”或实际上没有开启事务。
AbstractPlatformTransactionManager#prepareTransactionStatus
AbstractPlatformTransactionManager#newTransactionStatus
AbstractPlatformTransactionManager#prepareSynchronization
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());<br>TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(definition.getIsolationLevel() != -1 ? definition.getIsolationLevel() : null);<br>TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());<br>TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());<br>TransactionSynchronizationManager.initSynchronization();
int PROPAGATION_REQUIRED = 0;(默认)<br>定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。<br>原理:确保操作在同一个事务中执行,是 Spring 默认的事务传播行为。<br>int PROPAGATION_REQUIRES_NEW = 3;<br>定义:创建一个新的事务,如果当前存在事务,则把当前事务挂起。<br>原理:需要独立提交或回滚的子操作,适用于日志记录等场景。<br>int PROPAGATION_NESTED = 6;<br>定义:如果存在事务,则在嵌套事务内执行;否则,类似于 REQUIRED。<br>原理:基于底层数据库的保存点(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