`
blue2048
  • 浏览: 178234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring事务深入剖析 - 一些重要状态对象的分析

阅读更多

在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;
}
 
 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics