SpringBoot 中 Transactional mybatis 事务

olivee 2年前 ⋅ 127 阅读

1. @Transactional注解

1.1 抛出异常

// 这注解Transactional,因此就只会获取一个JDBC Connection,否则代码中的三个Mapper或获取并释放三个连接
@Transactional
@Transactional
public void jdbcOperation() {
    try {
        xxx1Mapper.xxx1();
        xxx2Mapper.xxx2();
        xxx3Mapper.xxx3();
    } catch (Exception e) {
        // 抛出RuntimeException就会回滚事物
        throw new RuntimeExcepiton(e);
    }
}

1.2 不抛出异常

  • 方案1:
// 这注解Transactional,因此就只会获取一个JDBC Connection,否则代码中的三个Mapper或获取并释放三个连接
@Transactional
public void jdbcOperation() {
    try {
        xxx1Mapper.xxx1();
        xxx2Mapper.xxx2();
        xxx3Mapper.xxx3();
    } catch (Exception e) {
        // 这里不把异常外外抛, 这样就不会回滚事物
        // 如果抛出RuntimeException就会回滚事物  导致只有部分数据删除成功
    }
}
  • 方案2:
// 这注解Transactional,因此就只会获取一个JDBC Connection,否则代码中的三个Mapper或获取并释放三个连接
@Transactional
public void jdbcOperation() {
    // 单独捕获每个mapper异常,其中一个mapper失败不会影响其它mapper,同时由只获取一次JDBC Connection
    try {
        xxx1Mapper.xxx1();
    } catch (Exception e) {
        // 这里不把异常外外抛, 这样就不会回滚事物
    }
    try {
        xxx2Mapper.xxx2();
    } catch (Exception e) {
        // 这里不把异常外外抛, 这样就不会回滚事物
    }
    try {
        xxx3Mapper.xxx3();
    } catch (Exception e) {
        // 这里不把异常外外抛, 这样就不会回滚事物
    }
}

2. 无Transactional注解

public void jdbcOperation() {
    xxx1Mapper.xxx1(); //这里会是一个单独的完整事物,含获取连接、提交、关闭
    xxx2Mapper.xxx2(); //这里会是一个单独的完整事物,含获取连接、提交、关闭
    xxx3Mapper.xxx3(); //这里会是一个单独的完整事物,含获取连接、提交、关闭
}