在spring的事务运行过程中,需要保存一些状态,涉及的一些对象如下
1. TransactionSynchronizationManager
2. SuspendedResourcesHolder
3. DefaultTransactionStatus
底层以JDBC DataSourceTransactionManager为例,状态对象
1. DataSourceTransactionObject
2. ConnectionHolder
下面逐一进行分析说明
TransactionSynchronizationManager-使用TreadLocal记录事务的一些属性,用于应用扩展同步器的使用,在事务的开启,挂起,提交等各个点上回调应用的逻辑
ThreadLocal<Map<Object, Object>> resources - 应用代码随事务的声明周期绑定的对象
ThreadLocal<Set<TransactionSynchronization>> synchronizations-使用的同步器,用于应用扩展
ThreadLocal<String> currentTransactionName-事务的名称
ThreadLocal<Boolean> currentTransactionReadOnly-事务是否是只读
ThreadLocal<Integer> currentTransactionIsolationLevel-事务的隔离界别
ThreadLocal<Boolean> actualTransactionActive-事务是否开启
TransactionSynchronizationManager状态变化的点
1. 开启新的事务时初始化TransactionSynchronizationManager属性,即第一次开启事务;已存在事务,但根据事务的传播属性需要开启新事务,这两个点。
public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
doBegin(transaction, definition);
prepareSynchronization(status, definition);
}
private TransactionStatus handleExistingTransaction(
TransactionDefinition definition, Object transaction, boolean debugEnabled)
throws TransactionException {
doBegin(transaction, definition);
prepareSynchronization(status, definition);
}
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
if (status.isNewSynchronization()) {
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
(definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
}
}
2. 在事务的嵌套过程中,TransactionSynchronizationManager属性不断更新最终清除,即外层事务挂起;事务提交,这两个点需要更新TransactionSynchronizationManager属性
protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.setCurrentTransactionName(null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(false);
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(null);
TransactionSynchronizationManager.setActualTransactionActive(false);
}
}
private void cleanupAfterCompletion(DefaultTransactionStatus status) {
TransactionSynchronizationManager.clear();
}
SuspendedResourcesHolder-外层事务挂起时,保存事物属性的对象,用于恢复外城事务和TransactionSynchronizationManager
protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException {
return new SuspendedResourcesHolder(
suspendedResources, suspendedSynchronizations, name, readOnly, isolationLevel, wasActive);
}
protected static class SuspendedResourcesHolder {
//底层事务框架在挂起处存储的对象,用于扩展
private final Object suspendedResources;
//同步器
private List<TransactionSynchronization> suspendedSynchronizations;
private String name;
private boolean readOnly;
private Integer isolationLevel;
private boolean wasActive;
}
当回复外层事务时,根据SuspendedResourcesHolder对象,调用底层事务框架回复事务属性,并恢复TransactionSynchronizationManager
protected final void resume(Object transaction, SuspendedResourcesHolder resourcesHolder)
throws TransactionException {
if (resourcesHolder != null) {
Object suspendedResources = resourcesHolder.suspendedResources;
if (suspendedResources != null) {
doResume(transaction, suspendedResources);
}
List<TransactionSynchronization> suspendedSynchronizations = resourcesHolder.suspendedSynchronizations;
if (suspendedSynchronizations != null) {
TransactionSynchronizationManager.setActualTransactionActive(resourcesHolder.wasActive);
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(resourcesHolder.isolationLevel);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(resourcesHolder.readOnly);
TransactionSynchronizationManager.setCurrentTransactionName(resourcesHolder.name);
doResumeSynchronization(suspendedSynchronizations);
}
}
}
3. DefaultTransactionStatus-这个是整个事务框架最重要的状态对象,它贯穿于事务拦截器,spring抽象框架和底层具体事务实现框架之间,它的重要任务是在新建,挂起,提交事务的过程中保存对应事务的属性。在AbstractPlatformTransactionManager中,每个事物流程都会创建这个对象
//新建事务
protected DefaultTransactionStatus newTransactionStatus(
TransactionDefinition definition, Object transaction, boolean newTransaction,
boolean newSynchronization, boolean debug, Object suspendedResources) {
boolean actualNewSynchronization = newSynchronization &&
!TransactionSynchronizationManager.isSynchronizationActive();
return new DefaultTransactionStatus(
transaction, newTransaction, actualNewSynchronization,
definition.isReadOnly(), debug, suspendedResources);
}
//PROPAGATION_REQUIRED传播时,使用上层事务
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
if (status.isNewSynchronization()) {
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
(definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
}
}
4. DataSourceTransactionObject-底层JDBC具体框架使用的对象,其中包含ConnectionHolder,这个对象被上层spring抽象事物层的DefaultTransactionStatus持有,用于这两层事务框架的交互
5. ConnectionHolder-底层JDBC以dtasource为key,存储事务相关属性对象,是底层判断事务是否存在的关键。
public class ConnectionHolder extends ResourceHolderSupport {
public static final String SAVEPOINT_NAME_PREFIX = "SAVEPOINT_";
private ConnectionHandle connectionHandle;
private Connection currentConnection;
private boolean transactionActive = false;
private Boolean savepointsSupported;
private int savepointCounter = 0;
}