在 MySQL 中,事务用于确保一组数据库操作要么全部成功执行,要么全部不执行,从而保证数据的一致性和完整性。事务具有 ACID 特性(原子性、一致性、隔离性、持久性),常用于处理涉及多表或多步骤的关键业务逻辑。
开启事务
使用 BEGIN 或 START TRANSACTION 来显式开启一个事务:
START TRANSACTION;
-- 或者
BEGIN;
提交事务
当所有 SQL 语句执行成功后,使用 COMMIT 将更改永久保存到数据库:
COMMIT;
例如:
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE user_id = 1;
UPDATE account SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
回滚事务
如果中间出现错误或需要取消操作,可以使用 ROLLBACK 回退到事务开始前的状态:
ROLLBACK;
例如:
START TRANSACTION;
INSERT INTO orders (user_id, amount) VALUES (1, 200);
UPDATE inventory SET stock = stock - 1 WHERE item_id = 10;
-- 假设库存不足,触发异常
ROLLBACK;
自动提交模式
MySQL 默认开启自动提交(autocommit = 1),即每条 SQL 语句都会被立即提交。要手动控制事务,需关闭自动提交:
SET autocommit = 0;
关闭后,所有语句将在当前事务中执行,直到遇到 COMMIT 或 ROLLBACK 才会结束事务。
事务的注意事项
事务只对支持事务的存储引擎有效,如 InnoDB。MyISAM 不支持事务。 避免长时间持有事务,否则可能导致锁等待或性能下降。 在应用程序中建议结合 try-catch 使用事务,出错时进行回滚。 可设置保存点(SAVEPOINT)实现部分回滚:SAVEPOINT sp1;
-- 执行某些操作
ROLLBACK TO sp1;
基本上就这些。合理使用事务能有效保障数据安全,特别是在处理金融交易、订单系统等场景中尤为重要。
