在MySQL中,事务是保证数据库操作原子性的核心机制。通过事务,可以确保一组SQL操作要么全部成功执行,要么全部不执行,从而避免数据不一致的问题。
开启事务控制
MySQL默认每条SQL语句自动提交(autocommit = 1),要使用事务必须手动关闭自动提交或显式开始事务。
使用 START TRANSACTION 显式开始一个事务 也可以用 BEGIN 或 BEGIN WORK,效果相同 执行完成后,根据结果选择 COMMIT 提交或 ROLLBACK 回滚示例:
START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 如果两条更新都成功 COMMIT; -- 如果任一失败 -- ROLLBACK;
确保使用支持事务的存储引擎
不是所有MySQL存储引擎都支持事务。必须使用支持事务的引擎,如 InnoDB。
MyISAM 不支持事务,不能回滚 InnoDB 是默认且推荐的引擎,完整支持ACID特性 建表时确认使用 InnoDB:CREATE TABLE ... ENGINE=InnoDB;正确处理异常并回滚
在应用程序中,需要捕获SQL执行过程中的错误,并触发回滚。
执行关键操作时监控返回结果或异常 一旦发现错误,立即执行 ROLLBACK 防止部分写入 在脚本或程序中设置事务边界,避免跨操作污染例如在PHP中:
$pdo->beginTransaction();
try {
$pdo->exec("UPDATE a SET val = val - 10");
$pdo->exec("UPDATE b SET val = val + 10");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
}
合理设置隔离级别
事务隔离级别影响并发行为和数据一致性。可根据业务需求调整。
READ COMMITTED:避免读取未提交数据 REPEATABLE READ(InnoDB默认):防止不可重复读 通过 SET TRANSACTION ISOLATION LEVEL 调整事务的基本原则是“全做或全不做”。只要在操作开始前开启事务,中间任意步骤出错就回滚,就能有效保障原子性。
基本上就这些。关键是开启事务、用对引擎、出错回滚。
