基于 `SqlSession` 的事务手动管理机制

保证数据库操作原子性、维护数据一致性的核心基础

一、概述

MyBatis 自身的事务控制无需依赖外部框架(如 Spring),全程以 SqlSession(SQL 会话对象)为核心载体,所有事务相关操作都围绕该对象展开

其中 commit()(事务手动提交)和 rollback()(事务手动回滚)是该机制的两个核心方法,用于收尾事务流程,确保多步增、删、改操作的原子性(要么全部成功持久化,要么全部失败回滚到原始状态)

MyBatis 默认采用手动事务模式autoCommit=false

二、commit()rollback()

commit() 事务手动提交方法

  • 核心作用 :将当前 SqlSession 事务中,所有已执行但未生效的增、删、改操作,永久同步到数据库中 ,完成事务的正常收尾,事务结束后 SqlSession 会自动开启新的事务

  • 核心特性

    • 依赖默认配置:默认 autoCommit=false,增删改操作执行后仅缓存结果,不会自动生效,必须手动调用此方法才能持久化
    • 缓存联动:无参 commit() 等价于 commit(true),会先刷新 MyBatis 一级、二级缓存,再提交事务,保证缓存与数据库数据一致
    • 原子性保障:同一个 SqlSession 中的多步操作,调用 commit() 会全部生效,不存在 "部分操作持久化" 的情况

rollback() 事务手动回滚方法

  • 核心作用 :当事务执行出现异常(SQL 执行异常、业务逻辑异常等)时,撤销当前 SqlSession 事务中所有未提交的操作,将数据库状态恢复到事务开始前的原始状态,避免数据错乱

  • 核心特性

    • 有效范围限制:仅对 "未调用 commit()" 的未完成事务有效,已提交的事务无法回滚
    • 异常场景专属:通常在 try-catchcatch 块中调用,是保证数据一致性的关键兜底操作
    • 简化使用:日常开发中无参 rollback() 即可满足大部分需求,无需额外配置复杂回滚规则

三、延伸

  1. MyBatis 事务的两种模式

    • 手动事务模式(默认):autoCommit=false,需手动调用 commit()/rollback(),适用于多步操作需保证原子性的场景(如转账:扣款 + 到账需同时成功或失败)
    • 自动事务模式:获取 SqlSession 时指定 openSession(true),开启 autoCommit=true,每一条增删改 SQL 执行后自动提交,仅适用于单步独立操作,无法保证多步操作原子性
  2. SqlSession 关闭的隐含行为

    当调用 sqlSession.close() 释放资源时,若存在未提交的事务,MyBatis 会自动执行 rollback(),撤销所有未持久化的操作,避免残留无效缓存

  3. 事务的适用范围限制

    仅对「增、删、改操作(<insert><update><delete>)」有效,<select> 查询操作不修改数据库数据,不受事务控制,无需提交或回滚

  4. 与 Spring 整合后的变化

    实际项目中,MyBatis 通常与 Spring 整合,事务管理会被 Spring 接管(核心是 @Transactional 注解),无需手动调用 commit()/rollback(),Spring 会根据执行结果自动完成事务收尾

四、核心价值

  1. 保证数据一致性:避免多步操作中 "部分成功、部分失败" 导致的数据错乱,符合业务逻辑完整性要求
  2. 灵活控制事务流程:无需依赖外部框架,即可完成基础事务管理,适配简单项目的开发需求
  3. 为框架整合打基础:理解 MyBatis 原生事务机制,能更好地掌握其与 Spring 事务的整合逻辑,提升复杂项目开发规范性

总结

  1. 核心知识点:MyBatis 基于 SqlSession 的事务手动管理机制
  2. 核心前提:默认 autoCommit=false(手动事务模式)
  3. 核心方法:commit()(持久化操作)、rollback()(撤销未提交操作)
  4. 核心价值:保证数据库操作原子性,维护数据一致性
相关推荐
上海蓝色星球4 分钟前
从工具到资产:CER V2.0 造价机器人如何重构企业核心竞争力
java·数据库·mysql
i220818 Faiz Ul10 分钟前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·高校教务系统
SelectDB技术团队11 分钟前
强行拍平?全表扫描? AI Agent 动态 JSON 的观测分析
数据库·人工智能·json·apache doris
SL-staff11 分钟前
JVS低代码动态建表原理:从模型配置到数据库DDL的生成逻辑
数据库·低代码·二次开发·源码解析·jvs·动态建表·ddl生成
van久14 分钟前
Day30:Redis 缓存策略 + 菜单实战缓存 + 三大缓存问题(穿透 / 击穿 / 雪崩)
数据库·redis·缓存
2501_9012005314 分钟前
Laravel 大批量数据填充时的内存泄漏与性能优化指南
jvm·数据库·python
ID_1800790547316 分钟前
除了JSON,淘宝店铺商品API接口还支持哪些数据格式?
android·数据库
newnazi17 分钟前
RedHart安装Oracle 12C
数据库·oracle
霸道流氓气质28 分钟前
Spring AI ChatMemory 对话记忆配置JDBC方式到Mysql数据库实战示例与原理讲解
数据库·人工智能·spring
与数据交流的路上33 分钟前
Redis-jedis连接池配置错误导致Redis CPU飙高
数据库·redis·缓存