温馨提示×

温馨提示×

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

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

Java SQL事务怎么开启

发布时间:2026-10-10 18:05:08 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中开启 SQL 事务,主要取决于你使用的是 JDBC、Spring(声明式/编程式事务)还是 ORM 框架(MyBatis、JPA 等)。下面按常见情况说明。


一、原生 JDBC 开启事务(最基础)

JDBC 默认是 自动提交(autoCommit = true),需要手动关闭。

Connection conn = null;
try {
    conn = dataSource.getConnection();
    
    // 1. 关闭自动提交,开启事务
    conn.setAutoCommit(false);

    // 2. 执行 SQL
    PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET money = money - 100 WHERE id = 1");
    ps1.executeUpdate();

    PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET money = money + 100 WHERE id = 2");
    ps2.executeUpdate();

    // 3. 提交事务
    conn.commit();

} catch (Exception e) {
    // 4. 回滚事务
    if (conn != null) conn.rollback();
    e.printStackTrace();
} finally {
    if (conn != null) conn.close();
}

✅ 关键点:

  • setAutoCommit(false):开启事务
  • commit():提交
  • rollback():回滚

二、Spring + JDBC / MyBatis(推荐)

1️⃣ 声明式事务(最常用)

@Service
public class AccountService {

    @Transactional
    public void transfer() {
        // 多个 SQL 操作
        accountMapper.decrease(1, 100);
        accountMapper.increase(2, 100);
    }
}

✅ 需要:

  • @EnableTransactionManagement(Spring Boot 默认开启)
  • 数据源配置事务管理器

2️⃣ 编程式事务(手动控制)

@Autowired
private TransactionTemplate transactionTemplate;

public void transfer() {
    transactionTemplate.execute(status -> {
        accountMapper.decrease(1, 100);
        accountMapper.increase(2, 100);
        return null;
    });
}

三、Spring Boot + JPA / Hibernate

@Transactional
public void saveUser() {
    userRepository.save(user1);
    userRepository.save(user2);
}

✅ JPA 默认就在事务中(Spring 管理)


四、事务隔离级别(可选)

@Transactional(
    isolation = Isolation.READ_COMMITTED,
    propagation = Propagation.REQUIRED
)

五、常见注意点 ⚠️

  1. 异常必须抛出,否则事务不会回滚
  2. MySQL 必须使用 InnoDB 引擎
  3. 同一个 Connection 才能算一个事务
  4. Spring 事务基于代理,内部方法调用不生效

六、总结一句话

JDBC:setAutoCommit(false)
Spring:@Transactional 搞定一切

如果你用的是 MyBatis / Spring Boot / 多数据源,可以告诉我,我可以给你更具体的示例。

向AI问一下细节

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

AI
助
手