SpringDataSourceAndTransaction-源码-02

总结摘要
Spring 数据源与事务源码介绍02

创建事务-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