温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis怎么处理事务

发布时间:2026-09-02 18:11:19 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

Java + MyBatis 中,事务处理主要有 三种常见方式,下面按使用频率和场景给你系统讲一下。


一、Spring + MyBatis(最常用 ✅)

如果你用的是 Spring / Spring Boot强烈推荐用 Spring 管理事务

1️⃣ 声明式事务(@Transactional)

配置(Spring Boot 已自动配置)

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

使用方式

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void createUser() {
        userMapper.insertUser();
        userMapper.updateUser();
        // 如果抛异常,自动回滚
    }
}

✅ 特点:

  • 自动开启 / 提交 / 回滚事务
  • 方法抛 RuntimeException 才回滚(默认)
  • 推荐在实际项目中使用

2️⃣ 事务传播行为(常见面试点)

@Transactional(propagation = Propagation.REQUIRED)

常见类型:

  • REQUIRED(默认):有就用,没有就建
  • REQUIRES_NEW:新建事务
  • SUPPORTS:有就用,没有就不开

3️⃣ 手动控制回滚

@Transactional
public void test() {
    try {
        userMapper.insert();
    } catch (Exception e) {
        TransactionAspectSupport.currentTransactionStatus()
            .setRollbackOnly();
    }
}

二、纯 MyBatis(无 Spring)

如果你 没有用 Spring,可以手动控制事务。

1️⃣ 获取 SqlSession

SqlSession session = sqlSessionFactory.openSession(false); // 关闭自动提交
try {
    UserMapper mapper = session.getMapper(UserMapper.class);
    mapper.insertUser();
    mapper.updateUser();
    session.commit(); // 提交
} catch (Exception e) {
    session.rollback(); // 回滚
} finally {
    session.close();
}

✅ 关键点:

  • openSession(false) → 手动事务
  • commit() / rollback()

三、MyBatis + Spring(XML 配置方式)

1️⃣ 事务管理器

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2️⃣ 开启注解事务

<tx:annotation-driven transaction-manager="transactionManager"/>

四、常见坑 ⚠️

1️⃣ 方法必须是 public

@Transactional
private void test() {} // ❌ 不生效

2️⃣ 自调用事务失效

public void a() {
    b(); // ❌ 事务不生效
}

@Transactional
public void b() {}

✅ 解决:使用代理对象或拆类


3️⃣ 捕获异常但不抛出

try {
    mapper.insert();
} catch (Exception e) {
    // ❌ 不抛异常,事务不会回滚
}

五、总结

方式 推荐度 场景
Spring @Transactional ⭐⭐⭐⭐⭐ 企业项目
手动 SqlSession ⭐⭐ 无 Spring
XML 事务 ⭐⭐⭐ 老项目

如果你愿意,我可以:

  • ✅ 给你一个 完整 Spring Boot + MyBatis 事务示例
  • ✅ 讲 多数据源事务
  • ✅ 讲 分布式事务(Seata)

你现在是 Spring Boot 还是纯 MyBatis

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI