好的,阿杰,我们来详细讲讲 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
:回滚事务,撤销修改- 事务保证数据一致性和原子性,适合处理 转账、订单处理、库存修改 等关键业务。
发表回复