好的,阿杰,我们来详细讲讲 MySQL 事务中 ROLLBACK 和 COMMIT 的用法,包括概念、基本语法和使用场景。为了清晰,我会一步步展开。


1️⃣ MySQL 事务概念

**事务(Transaction)**是指一组 SQL 操作,要么全部执行成功,要么全部失败回滚。事务保证了数据库的 ACID 特性:

  • Atomicity(原子性):事务要么全部成功,要么全部失败。
  • Consistency(一致性):事务执行前后,数据库必须保持一致状态。
  • Isolation(隔离性):并发事务之间不会互相干扰。
  • Durability(持久性):事务提交后,数据永久保存。

注意:MySQL 事务只有在 支持事务的存储引擎(如 InnoDB)下才有效,MyISAM 不支持事务。


2️⃣ 基本事务语法

MySQL 中事务主要涉及三条命令:

命令功能说明
START TRANSACTION / BEGIN开始一个事务
COMMIT提交事务,使修改生效
ROLLBACK回滚事务,撤销修改

示例:

-- 开启事务
START TRANSACTION;

-- 执行多条 SQL
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 提交事务
COMMIT;

这里,如果两个 UPDATE 都成功执行,则 COMMIT 提交,资金转账生效。

如果出现异常:

-- 回滚事务
ROLLBACK;

则两个 UPDATE 都不会生效,保证数据一致性。


3️⃣ 使用 COMMIT 提交事务

  • 作用:将事务中所有操作永久保存到数据库中。
  • 使用场景:当一组操作都执行成功后,保证数据修改生效。
START TRANSACTION;

INSERT INTO orders(user_id, product_id, quantity) VALUES(1, 101, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 101;

COMMIT; -- 提交事务

注意:提交后无法回滚。


4️⃣ 使用 ROLLBACK 回滚事务

  • 作用:撤销事务中尚未提交的操作,恢复数据到事务开始前状态。
  • 使用场景:遇到错误、异常、业务校验不通过时。
START TRANSACTION;

UPDATE accounts SET balance = balance - 500 WHERE user_id = 1;

-- 假设余额不足,手动回滚
ROLLBACK;

执行 ROLLBACK 后,user_id = 1 的余额不会减少。


5️⃣ 自动提交与事务控制

MySQL 默认 自动提交(autocommit=1),即每条 SQL 都是一个独立事务:

SELECT @@autocommit;  -- 查看是否开启自动提交
SET autocommit = 0;   -- 关闭自动提交,手动控制事务

关闭自动提交后,你必须显式 COMMIT 或 ROLLBACK,否则修改不会生效。


6️⃣ 事务示例(完整流程)

-- 关闭自动提交
SET autocommit = 0;

-- 开启事务
START TRANSACTION;

-- 执行操作
INSERT INTO orders(user_id, product_id, quantity) VALUES(1, 101, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 101;

-- 条件判断
SELECT stock FROM products WHERE product_id = 101;
-- 如果库存不足
-- ROLLBACK;
-- 否则
COMMIT;

-- 重新开启自动提交
SET autocommit = 1;

✅ 小结

  • START TRANSACTION / BEGIN:开始事务
  • COMMIT:提交事务,数据永久生效
  • ROLLBACK:回滚事务,撤销修改
  • 事务保证数据一致性和原子性,适合处理 转账、订单处理、库存修改 等关键业务。