Mysql事务
一、是什么?
MySQL事务是数据库操作的逻辑单元,由一组SQL语句组成。这些操作要么全部成功执行(提交),要么全部失败回滚(撤销),确保数据状态始终一致。事务遵循ACID原则(原子性、一致性、隔离性、持久性),是数据库可靠性的核心机制。
二、解决什么问题
- 数据不一致:例如转账时A账户扣款成功,B账户入账失败,导致资金丢失。
- 并发冲突:多用户同时操作同一数据时可能产生脏读、不可重复读等问题。
- 操作不可逆:执行错误操作后无法恢复到之前状态。
三、核心特性(ACID)
特性 | 说明 | 实现机制 |
---|---|---|
Atomicity(原子性) | 事务内操作要么全成功,要么全失败 | Undo Log(撤销日志) |
Consistency(一致性) | 事务使数据库从一个有效状态转换到另一个有效状态 | 由应用层和数据库共同保证 |
Isolation(隔离性) | 并发事务相互隔离,防止数据干扰 | 锁机制/MVCC(多版本并发控制) |
Durability(持久性) | 事务提交后修改永久保存,即使系统故障 | Redo Log(重做日志) |
四、应用场景
- 金融交易:如转账操作(扣款+入账必须同时成功)。
- 订单系统:创建订单时需同步扣减库存、生成支付记录。
- 批量数据处理:导入大量数据时,全部成功或整体回滚。
五、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();
}
六、重要注意事项
- 隔离级别选择:
READ_UNCOMMITTED
(可能脏读)READ_COMMITTED
(Oracle默认,防脏读)REPEATABLE_READ
(MySQL默认,防不可重复读)SERIALIZABLE
(完全隔离,性能最低)
sqlSET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置隔离级别
- 避免长事务:长时间未提交的事务会占用锁资源,导致阻塞。
- Spring事务管理:推荐使用
@Transactional
注解简化事务控制(需Spring Boot支持)。 - 嵌套事务:MySQL不支持嵌套事务,内层事务的提交/回滚会作用于外层事务。
七、总结
MySQL事务通过ACID特性保障数据可靠性,适用于需要原子性操作的业务场景。开发中应合理选择隔离级别,避免长事务,结合Spring等框架可提升效率。JDK8+环境下,推荐使用try-with-resources
自动管理连接资源,确保事务安全。