讲师中心 微信公众号
AI工具推荐 视频效率加速

MyBatis集成Spring的核心机制是什么_SqlSessionTemplate对事务与连接的管理

风杰大大_9537

风杰大大_9537

发布时间:2026-03-17 12:49:25

|

310人浏览过

|

来源于php中文网

原创

SqlSessionTemplate 通过动态代理+ThreadLocal绑定事务内SqlSession实现线程安全与事务一致,依赖TransactionSynchronizationManager管理生命周期,避免手动获取原生session导致事务不同步或连接泄漏。

mybatis集成spring的核心机制是什么_sqlsessiontemplate对事务与连接的管理

SqlSessionTemplate 怎么保证线程安全又不破坏事务

它不是直接包装 SqlSessionFactory 创建新 SqlSession,而是用动态代理把所有方法调用转给一个“当前线程绑定的” SqlSession。这个 session 由 Spring 的 TransactionSynchronizationManager 管理——事务开始时绑定,提交或回滚后清理。

关键点在于:它自己不持有真实 SqlSession 实例,每次调用都从 Spring 的事务上下文中取;没事务时才临时创建非托管 session(但不推荐裸用)。

  • 如果在 service 层没加 @Transactional,SqlSessionTemplate 会 fallback 到非事务模式,执行完立刻 close,无法复用连接
  • 多个 DAO 共享同一个 SqlSessionTemplate 实例完全安全,因为底层 session 是按事务线程隔离的
  • 别手动调用 sqlSessionTemplate.getSqlSession() 拿原生 session——这会绕过代理逻辑,导致事务不同步、连接泄漏

为什么不能用 SqlSessionUtils.openSession() 替代 SqlSessionTemplate

SqlSessionUtils.openSession() 返回的是原始 SqlSession,它不会自动注册到 Spring 事务同步器里。哪怕你在 @Transactional 方法里这么写,Spring 也感知不到这个 session,事务提交时不会 flush 或 commit 它。

常见错误现象:insert 执行成功但数据库没数据,或者抛出 SqlSession is not synchronized with Transaction 类似提示。

  • 只有 SqlSessionTemplate 和 SqlSessionDaoSupport 子类能真正接入 Spring 事务生命周期
  • openSession() 适合测试或脱离 Spring 环境的场景,生产代码中混用极易导致脏读或连接未释放
  • MyBatis-Spring 3.x 后已标记 SqlSessionUtils.openSession() 为 @Deprecated,明确不鼓励使用

Mapper 接口背后怎么和 SqlSessionTemplate 绑定的

Spring 在扫描 @Mapper 接口时,实际注入的是一个 JDK 动态代理对象。这个代理不持 SqlSession,而是每次调用方法时,通过 MapperMethod 解析 SQL,再委托给容器里的 SqlSessionTemplate 执行。

所以你看到的 userMapper.insert(user),本质是 sqlSessionTemplate.insert("com.example.UserMapper.insert", user)。

  • Mapper 接口必须由 Spring 的 MapperScannerConfigurer 或 @MapperScan 注入,手写 new UserMapperImpl() 会丢失事务上下文
  • 同一个 Mapper 接口多次注入(比如用 @Primary + 备份 bean),只要底层共用同一个 SqlSessionTemplate,事务就仍然有效
  • 若配置了多个 SqlSessionFactory,必须确保每个 MapperScannerConfigurer 明确指定对应的 sqlSessionFactoryBeanName,否则可能绑定错 session 工厂

事务传播行为下 SqlSessionTemplate 会怎样表现

它本身不处理传播逻辑,全靠 Spring 的 TransactionSynchronizationManager。比如外层 @Transactional(propagation = Propagation.REQUIRED) 开启事务后,内层方法即使也加了 @Transactional,只要传播类型兼容,依然复用同一个线程绑定的 SqlSession。

但如果内层用了 REQUIRES_NEW,Spring 会 suspend 当前 session 并新建一个,此时 SqlSessionTemplate 会自动切换到新的绑定实例。

  • NESTED 行为依赖数据库支持 savepoint,SqlSessionTemplate 会配合 SqlSession 的 savepoint 方法做回滚,但 MyBatis 本身不管理 savepoint 名称,全交给 JDBC 驱动
  • 如果在 REQUIRES_NEW 方法里手动调用 sqlSessionTemplate.clearCache(),只清空当前新 session 的缓存,不影响外层
  • 跨线程(如 @Async)必然丢失事务绑定,此时 SqlSessionTemplate 只能走非事务分支——这是最容易被忽略的隐性断点

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2311

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2142

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

292

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

5289

2025.08.26

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

20

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn