Mybatis-Spring Interactions

本文深入探讨了Spring框架中的事务管理机制与Mybatis的整合应用,详细解析了如何在Spring环境下实现数据源连接获取、事务同步及SqlSessionFactory的构建过程。同时,阐述了SqlSessionFactoryBean的配置细节以及SqlSessionTemplate的线程安全特性,最终通过实例演示了如何在同一个事务中灵活切换执行模式,确保数据的一致性和并发控制。

Spring side:

DataSourceUtils->getConnection(dataSource)->

TransactionSynchronizationManager.getResource(dataSource)

SpringManagedTransaction->getConnection()->this.connection = DataSourceUtils.getConnection(this.dataSource);

 

SqlSessionFactoryBean:
buildSqlSessionFactory():

this.transactionFactory = new SpringManagedTransactionFactory();--> newTransaction(dataSource,..., ...)

    Environment environment = new Environment(this.environment, this.transactionFactory, this.dataSource);
    configuration.setEnvironment(environment);

 
Configuration:
configuration.defaultExecutorType = ExecutorType.SIMPLE;
newExecutor(Transaction transaction, ExecutorType executorType);

DefaultSqlSessionFactory:
openSessionFromDataSource/openSessionFromConnection--return SqlSession-->
[
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
]

SqlSessionTemplate:

Thread safe, Spring managed, -->Proxy-->

SqlSessionHolder holder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);

holder-->DefaultSqlSession:Executor:SIMPLE/BATCH->1:1

SqlSessionUtils.getSqlSession--> SqlSessionHolder[ResourceHolderSupport].requested++,released--, 

if no holder, TransactionSynchronizationManager.registerSynchronization ->

SqlSessionSynchronization[TransactionSynchronization.beforeCommit--> SqlSession.commit-->executor.commit[...flushStatements...]

TransactionSynchronization.beforeCompletion if referenceCount<=0 TransactionSynchronizationManager.unbindResource(sessionFactory)]

 

BATCH: flushStatements before doSelect

mapper->select/insert/update/delete flushCache 

Mybatis不允许在同一个事务并且是同一线程中并存2种执行模式。同一事务不同线程可以2种执行模式并存。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值