创建事务-createTransactionIfNecessary
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| // org.springframework.transaction.interceptor.TransactionAspectSupport#createTransactionIfNecessary
--> 如果未主动指定事务名称,则使用 joinpointIdentification(类名称+方法名)。将事务属性封装为`DelegatingTransactionAttribute`。
--> 创建事务。
--|> tm.getTransaction(txAttr);
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#getTransaction
--> org.springframework.jdbc.datasource.DataSourceTransactionManager#doGetTransaction
--> 创建`DataSourceTransactionObject`对象,封装数据源与事务信息。
--> 配置属性`savepointAllowed`,值来源于`AbstractPlatformTransactionManager#nestedTransactionAllowed`,在`DataSourceTransactionManager`中该值默认为 true。
--> 获取数据源。当前使用 jdbc `HikariDataSource`数据源。
--|> `obtainDataSource()`。
--|> org.springframework.jdbc.datasource.DataSourceTransactionManager#obtainDataSource
--> org.springframework.jdbc.datasource.DataSourceTransactionManager#getDataSource
--> 资源绑定,以数据源信息作为 key。
--|> org.springframework.transaction.support.TransactionSynchronizationManager#getResource
--> 配置属性`ConnectionHolder`且`DataSourceTransactionObject#newConnectionHolder`为 false。
--> 如果已存在事务,则进行嵌套事务处理。
--> 判断方式是,查询上一步骤获取的`DataSourceTransactionObject`对象中的`ConnectionHolder`是否已激活事务。
--|> org.springframework.jdbc.datasource.DataSourceTransactionManager#isExistingTransaction
--> txObject.getConnectionHolder().isTransactionActive()
--> 嵌套事务处理。
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#handleExistingTransaction
--|> 待补充
--> 校验 timeout 配置。
--> 如果事务属性为`TransactionDefinition.PROPAGATION_MANDATORY`,则抛出异常。该属性要求已存在1个事务,而如果执行到此处表示不存在事务。
--> 如果事务属性为`TransactionDefinition.PROPAGATION_REQUIRED`或`TransactionDefinition.PROPAGATION_REQUIRES_NEW`或`TransactionDefinition.PROPAGATION_NESTED`
--> 挂起资源。执行到此处时不存在事务。
--> 启动事务。org.springframework.transaction.support.AbstractPlatformTransactionManager#startTransaction
-->
--|> org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin
--> 根据需要初始化事务同步。
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#prepareSynchronization
--> 否则,创建1个空事务。
--> 获取属性`newSynchronization`。
--> 封装事务相关信息为 TransactionInfo,并绑定到当前线程。
--|> org.springframework.transaction.interceptor.TransactionAspectSupport#prepareTransactionInfo
--> 缓存当前线程中的`transactionInfoHolder`到属性`oldTransactionInfo`,设置新的`transactionInfoHolder`。
---|> org.springframework.transaction.interceptor.TransactionAspectSupport.TransactionInfo#bindToThread
|
提交事务-commit
1
2
3
4
5
6
7
| // org.springframework.transaction.support.AbstractPlatformTransactionManager#commit
--> 如果当前事务仅允许 rollback(`defStatus.isLocalRollbackOnly()`),则调用`processRollback`回滚事务。
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#processRollback
--> 如果全局事务标识为仅允许 rollback,且本地事务非必须 commit,则调用`processRollback`回滚事务。
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#processRollback
--> 否则,调用`processCommit`提交事务。
--|> org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit
|
提交事务-processCommit
1
2
| // org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit
-->
|
释放数据源连接
1
2
3
4
5
6
7
8
9
10
| org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit
org.springframework.transaction.support.AbstractPlatformTransactionManager#processRollback
提交或回滚均会释放数据源会话连接
--> processCommit/processRollback
--> org.springframework.transaction.support.AbstractPlatformTransactionManager#cleanupAfterCompletion
--> org.springframework.jdbc.datasource.DataSourceTransactionManager#doCleanupAfterCompletion
--> org.springframework.jdbc.datasource.DataSourceUtils#releaseConnection
--> org.springframework.jdbc.datasource.DataSourceUtils#doReleaseConnection
--> org.springframework.jdbc.datasource.DataSourceUtils#doCloseConnection
|
回滚事务-processRollback
1
2
| // org.springframework.transaction.support.AbstractPlatformTransactionManager#processRollback
-->
|
嵌套事务处理-handleExistingTransaction
1
2
| // org.springframework.transaction.support.AbstractPlatformTransactionManager#handleExistingTransaction
-->
|
END