Skip to content

Mysql事务

一、是什么?

MySQL事务是数据库操作的逻辑单元,由一组SQL语句组成。这些操作要么全部成功执行(提交),要么全部失败回滚(撤销),确保数据状态始终一致。事务遵循ACID原则(原子性、一致性、隔离性、持久性),是数据库可靠性的核心机制。

二、解决什么问题

  1. 数据不一致:例如转账时A账户扣款成功,B账户入账失败,导致资金丢失。
  2. 并发冲突:多用户同时操作同一数据时可能产生脏读、不可重复读等问题。
  3. 操作不可逆:执行错误操作后无法恢复到之前状态。

三、核心特性(ACID)

特性说明实现机制
Atomicity(原子性)事务内操作要么全成功,要么全失败Undo Log(撤销日志)
Consistency(一致性)事务使数据库从一个有效状态转换到另一个有效状态由应用层和数据库共同保证
Isolation(隔离性)并发事务相互隔离,防止数据干扰锁机制/MVCC(多版本并发控制)
Durability(持久性)事务提交后修改永久保存,即使系统故障Redo Log(重做日志)

四、应用场景

  1. 金融交易:如转账操作(扣款+入账必须同时成功)。
  2. 订单系统:创建订单时需同步扣减库存、生成支付记录。
  3. 批量数据处理:导入大量数据时,全部成功或整体回滚。

五、Java示例

java
// JDBC事务示例(JDK8+)
try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
    conn.setAutoCommit(false);  // 关闭自动提交
    
    // 执行SQL操作
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("UPDATE accounts SET balance=balance-100 WHERE id=1");  // 扣款
    stmt.executeUpdate("UPDATE accounts SET balance=balance+100 WHERE id=2");  // 入账
    
    conn.commit();  // 提交事务
} catch (SQLException e) {
    conn.rollback();  // 异常时回滚
    e.printStackTrace();
}

六、重要注意事项

  1. 隔离级别选择
    • READ_UNCOMMITTED(可能脏读)
    • READ_COMMITTED(Oracle默认,防脏读)
    • REPEATABLE_READ(MySQL默认,防不可重复读)
    • SERIALIZABLE(完全隔离,性能最低)
    sql
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置隔离级别
  2. 避免长事务:长时间未提交的事务会占用锁资源,导致阻塞。
  3. Spring事务管理:推荐使用@Transactional注解简化事务控制(需Spring Boot支持)。
  4. 嵌套事务:MySQL不支持嵌套事务,内层事务的提交/回滚会作用于外层事务。

七、总结

MySQL事务通过ACID特性保障数据可靠性,适用于需要原子性操作的业务场景。开发中应合理选择隔离级别,避免长事务,结合Spring等框架可提升效率。JDK8+环境下,推荐使用try-with-resources自动管理连接资源,确保事务安全。