在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 TransactionExcepti