MyBatis 会话与事务管理深度解析:从 SqlSession 到事务隔离级别的完整指南
文章目录
- 一、概述
- 二、整体架构:三大层次的分工协作
- 2.1 核心源码分布
- 2.2 组件关系全景图
- 2.3 典型调用链
- 三、SqlSession 会话接口深入解析
- 3.1 接口设计理念
- 3.2 核心方法族
- 查询方法
- 更新方法
- 事务控制
- 其他辅助方法
- 3.3 DefaultSqlSession 与调用链
- 3.4 会话生命周期最佳实践
- 四、SqlSessionFactory 构建与配置
- 4.1 构建流程
- 4.2 openSession 重载要点
- 4.3 SqlSessionFactoryBuilder
- 五、SqlSessionManager:线程绑定与自动事务
- 5.1 设计定位
- 5.2 工作流程
- 5.3 使用注意事项
- 六、执行器类型与性能特征
- 6.1 Executor 体系架构
- 6.2 四种执行器对比
- 6.3 执行器选择建议
- 6.4 执行器与事务的关系
- 七、事务管理机制
- 7.1 Transaction 接口设计
- 7.2 JdbcTransaction:独立事务控制
- 7.3 ManagedTransaction:容器托管
- 7.4 TransactionFactory 工厂体系
- 7.5 事务隔离级别
- 7.6 事务传播行为说明
- 7.7 TransactionException 异常处理
- 八、关键配置项详解
- 8.1 Configuration 集中配置中心
- 8.2 本地缓存范围 (LocalCacheScope)
- 8.3 自动映射行为 (AutoMappingBehavior)
- 8.4 未知列行为 (AutoMappingUnknownColumnBehavior)
- 8.5 延迟加载
- 九、ResultHandler 与流式处理
- 9.1 工作机制
- 9.2 应用场景
- 9.3 Cursor 游标
- 9.4 注意事项
- 十、RowBounds 分页参数与性能影响
- 10.1 使用方式
- 10.2 性能影响分析
- 10.3 最佳实践
- 十一、依赖关系分析
- 十二、性能优化策略总览
- 十三、常见问题排查指南
- Q1: 提交/回滚无效
- Q2: 大结果集导致内存溢出
- Q3: 二级缓存导致脏读
- Q4: 事务未生效
- Q5: 预编译语句未复用(REUSE 执行器)
- Q6: SqlSessionException 异常
- Q7: 事务传播与外部容器冲突
- Q8: 隔离级别设置后未生效
- 十四、总结
一、概述
MyBatis 作为 Java 生态中最流行的持久层框架之一,其会话(Session)与事务(Transaction)模块是整个框架的核心骨架。理解 SqlSession 如何封装底层 JDBC 操作、Executor 如何制定执行策略、Transaction 如何管理连接生命周期,对于写出高性能、健壮的数据访问层代码至关重要。
然而,许多开发者在实际使用中常常困惑于:应该选择哪种执行器类型?何时使用 ResultHandler 替代一次性加载?JdbcTransaction 与 ManagedTransaction 分别在什么场景下使用?本地缓存范围 SESSION 与 STATEMENT 该如何抉择?
本文基于 MyBatis 3.5.19 源码,对会话与事务模块进行系统化拆解,从接口设计、实现原理到最佳实践,帮助读者建立完整的知识体系。
二、整体架构:三大层次的分工协作
MyBatis 的会话与事务体系可以清晰地划分为三个层次:
| 层次 | 核心接口/类 | 职责 |
|---|---|---|
| 会话层 | SqlSession/DefaultSqlSession/SqlSessionFactory/SqlSessionManager</ |
