mybatis 事务由 sqlsession 所依赖的事务管理器控制;原生模式下,autocommit=false 时需手动 commit/rollback,true 时自动提交;spring 集成后由 @transactional 统一管理,禁止手动提交。

MyBatis 本身不直接管理事务,事务由底层的 SqlSession 所依赖的事务管理器(如 JDBC 的 Connection 或 Spring 的 DataSourceTransactionManager)控制。在原生 MyBatis(非 Spring 集成)中,SqlSession 是事务的载体,其提交/回滚行为取决于你如何创建和使用它。
SqlSession 的事务模式决定是否自动提交
创建 SqlSession 时,通过 SqlSessionFactory.openSession(ExecutorType, boolean autoCommit) 指定事务行为:
-
autoCommit = false(默认):开启手动事务控制。所有 SQL 操作(insert/update/delete)仅执行到数据库缓冲区,必须显式调用
sqlSession.commit()才真正提交;若不提交且 session 关闭,会自动 rollback。 - autoCommit = true:每次执行修改操作后立即提交,无法回滚,也不支持事务边界控制,一般仅用于只读或测试场景。
手动控制 commit/rollback 的典型流程
在 autoCommit = false 下,标准事务操作应遵循“try-catch-finally”结构:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 获取
SqlSession(非线程安全,应短生命周期使用) - 执行 Mapper 方法或
sqlSession.insert()/update()/delete() - 业务逻辑成功 → 调用
sqlSession.commit() - 发生异常 → 调用
sqlSession.rollback() - 无论成败,
finally中调用sqlSession.close()(否则连接泄漏)
注意 SqlSession 的生命周期与事务边界一致
一个 SqlSession 实例对应一个数据库连接(Connection)和一个事务上下文:
- 不能跨多个
SqlSession实现“统一事务”,它们彼此隔离 - 若在同一线程中多次调用
openSession(),每次都是新事务,除非复用同一个 session 实例 - 使用
SqlSessionTemplate(Spring 封装)或SqlSessionManager可实现线程绑定,但本质仍是单 session 单事务
与 Spring 集成时,事务由 Spring 控制,SqlSession 自动适配
当使用 Spring + MyBatis,推荐用 @Transactional 声明式事务:
- Spring 在方法开始前获取 Connection 并绑定到当前线程,创建一个共享的
SqlSession - Mapper 接口调用最终委托给该 session,所有操作处于同一事务中
- 方法正常结束 → Spring 自动
commit();抛出未捕获异常 → 自动rollback() - 此时不应再手动调用
sqlSession.commit(),否则会报错 “Transaction is already completed”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










