sqlsession 持有 Configuration
sqlsession 持有executor
Configuration 持有 MapperRegistry
Configuration 持有 Environment
Environment 持有dataSource
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory
的
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)
方法
创建
SqlSession
sqlsession 持有 Executor
Executor 持有 Transaction
Transaction 持有 datasource
----------------------------------------------------------------------------------------------------------spring-tx 持有2
TransactionAspectSupport 持有 TransactionInfo
TransactionInfo 持有 PlatformTransactionManager, TransactionAttribute , TransactionStatus
DataSourceTransactionManager 实现了 PlatformTransactionManager 接口
DataSourceTransactionManager 持有 DataSourceTransactionObject
DataSourceTransactionObject 持有 connectionholder
connectionholder 持有 connection
TransactionStatus
TransactionSynchronizationManager
Transaction的一个实现类org.apache.ibatis.transaction.jdbc.JdbcTransaction,这个类里维护了DataSource,在需要的时候会创建java.sql.Connection,在创建完java.sql.Connection后,会根据创建org.apache.ibatis.session.SqlSession时传递的参数值,设置java.sql.Connection是否自动提交。该类也提供了对Connection执行commit、rollback的方法,在org.apache.ibatis.session.SqlSession执行commit、rollback方法时,都会传递到这里的方法。
在mybatis-spring初始化的过程会执行如下的代码:
org.mybatis.spring.SqlSessionFactoryBean
if (this.transactionFactory == null) {
this.transactionFactory = new SpringManagedTransactionFactory();
}
Environment environment = new Environment(this.environment, this.transactionFactory, this.dataSource);
configuration.setEnvironment(environment);
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
TransactionAspectSupport 中的 transactionInfoHolder 记录了当前线程的事务状态 对应着 TransactionInfo中的oldTransactionInfo
ThreadLocal<TransactionInfo> transactionInfoHolder
网友评论