当前位置: 首页 > ds >正文

【Mytais系列】Update语句执行流程

以下是通过 时序图文字说明 详细描述的 MyBatis 执行 UPDATE/INSERT/DELETE 语句的完整流程,包括缓存清理、事务提交和数据库操作的各个环节:


时序图(Sequence Diagram)


详细执行流程解析

1. 客户端发起更新请求
  • 客户端调用 SqlSession 的更新方法(如 update),传入 SQL 语句标识(如 updateUser)和参数(如 User 对象)。
2. 一级缓存清理(BaseExecutor)
  • 立即清理一级缓存
    MyBatis 在执行 UPDATE/INSERT/DELETE 时,会直接清空当前 SqlSession 的一级缓存(localCache),确保后续查询能获取最新数据。
3. 数据库操作
  • 3.1 创建 PreparedStatement
    StatementHandler 创建 PreparedStatement 对象,并处理动态 SQL(如 <if> 标签)。
  • 3.2 参数绑定
    ParameterHandler 将参数对象(如 User)绑定到 SQL 占位符(?)。
  • 3.3 执行 SQL
    通过 JDBC 驱动执行 SQL,数据库返回影响行数。
4. 二级缓存清理(事务提交时生效)
  • 延迟清理二级缓存
    MyBatis 在事务提交(commit())或关闭 SqlSession 时,才会清理该 Mapper 对应的二级缓存。
    • 若事务未提交,二级缓存不会立即清理(避免中间状态污染缓存)。
    • 若事务提交,清理所有关联的二级缓存(通过 <cache-ref>Mapper 映射关系)。
5. 事务提交
  • 默认情况下,MyBatis 不会自动提交事务。需显式调用 sqlSession.commit(),此时:
    • 提交数据库事务(通过 TransactionManager)。
    • 清理关联的二级缓存(若配置了 <cache/>)。

关键组件作用

组件

职责

SqlSession

用户操作入口,封装会话状态和事务控制。

Executor

执行器,负责缓存清理和 SQL 执行(CachingExecutor 处理二级缓存逻辑)。

StatementHandler

处理 SQL 语句(创建 PreparedStatement)。

ParameterHandler

绑定 SQL 参数(支持复杂对象和动态参数)。

TransactionManager

管理事务提交/回滚(如 JdbcTransactionManagedTransaction)。


缓存清理规则

  1. 一级缓存
    • 立即清理:所有 DML 操作执行后,立即清空当前 SqlSession 的一级缓存。
    • 作用范围:仅当前会话。
  1. 二级缓存
    • 延迟清理:在事务提交或会话关闭时,清理关联的 Mapper 二级缓存。
    • 作用范围:全局(跨会话共享)。

示例场景

场景 1:更新后未提交事务
// 执行更新(清理一级缓存,二级缓存未清理)
sqlSession.update("updateUser", user);// 同一会话查询(查数据库,因一级缓存已清空)
User updatedUser = sqlSession.selectOne("selectUserById", 1);// 其他会话查询(命中旧二级缓存,数据不一致)
场景 2:更新后提交事务
// 执行更新(清理一级缓存)
sqlSession.update("updateUser", user);// 提交事务(清理二级缓存)
sqlSession.commit();// 其他会话查询(二级缓存已清空,查数据库)
SqlSession newSession = sqlSessionFactory.openSession();
User user = newSession.selectOne("selectUserById", 1);

注意事项

  1. 事务边界控制
    • 务必显式调用 commit()rollback(),否则数据库修改和二级缓存清理不会生效。
  1. 二级缓存关联性
    • 若多个 Mapper 共享缓存(通过 <cache-ref>),更新任意关联 Mapper 均会触发缓存清理。
  1. 批量操作优化
    • 使用 BatchExecutor 可批量执行 DML 语句,减少 JDBC 交互次数。
  1. 主键生成策略
    • INSERT 操作可通过 <selectKey>useGeneratedKeys 获取数据库生成的主键。

总结

MyBatis 执行 UPDATE/INSERT/DELETE 的流程核心是 数据一致性保证

  1. 立即清理一级缓存,避免当前会话后续查询读到脏数据。
  2. 延迟清理二级缓存,依赖事务提交机制确保全局缓存一致性。
  3. 事务提交是关键,未提交的修改不会影响二级缓存或数据库持久化。

理解这一流程可帮助开发者合理设计事务边界和缓存策略,避免因缓存未及时清理导致的数据不一致问题。

http://www.xdnf.cn/news/3844.html

相关文章:

  • 二、shell脚本--变量与数据类型
  • Python datetime库的用法 Python从入门到入土系列第3篇-洞察标准库DateTime
  • 【Spring】Spring中8种常见依赖注入使用示例
  • 健康养生新主张
  • web应用开发说明文档
  • matlab学习之旅
  • 数据结构---
  • 实战项目:基于控制台与数据库的图书管理系统开发指南
  • C语言中memmove和memcpy
  • 智慧校园整体解决方案-5PPT(65页)
  • python中的异常处理
  • 【CF】Day50——Codeforces Round 960 (Div. 2) BCD
  • 数学实验Matlab
  • 多把锁以及线程死锁问题
  • Linux-GRUB全面指南
  • CUDA输出“hello world”
  • 多数据源动态切换
  • 算法每日一题 | 入门-顺序结构-数字反转
  • (38)VTK C++开发示例 ---纹理裁剪
  • C++负载均衡远程调用学习之异步消息任务功能与连接属性
  • CVPR2021 | 重新思考视觉Transformer中的自注意力机制
  • Java学习手册:Spring 生态其他组件介绍
  • 单细胞测序试验设计赏析(一)
  • AWS在跨境电商中的全场景实践与未来生态构建
  • D. 例题3.2.2 整数划分问题
  • 二种MVCC对比分析
  • 学习黑客风险Risk
  • iOS启动优化:从原理到实践
  • 2025年渗透测试面试题总结-拷打题库35(题目+回答)
  • 【C++】:C++17新特性