MySQL事务-ROLLBACK,COMMIT用法详解
封面图
•
2025-10-08
•
MySQL
277
0
0
0
在 MySQL 中,**事务(Transaction)** 是一组 SQL 语句的集合,这些语句要么全部成功执行,要么全部失败回滚(Rollback)。事务确保了数据库操作的 **原子性(Atomicity)**、**一致性(Consistency)**、**隔离性(Isolation)** 和 **持久性(Durability)**,也就是常说的 **ACID 特性**。 --- ## 🧠 什么是事务? 事务是一组必须全部成功完成的操作。如果其中任何一个操作失败,整个事务就会被撤销,数据回到事务开始前的状态。 --- ## ✅ 事务的关键命令 MySQL 中使用以下命令来管理事务: | 命令 | 说明 | |------|------| | `START TRANSACTION` / `BEGIN` | 开始一个事务 | | `COMMIT` | 提交事务,使所有更改永久生效 | | `ROLLBACK` | 回滚事务,撤销所有未提交的更改 | --- ## 💡 使用示例 ### 示例 1:基本事务操作 ```sql -- 开始事务 START TRANSACTION; -- 修改用户信息 UPDATE users SET balance = balance - 100 WHERE id = 1; -- 修改账户信息 UPDATE accounts SET balance = balance + 100 WHERE user_id = 1; -- 如果没有错误,提交事务 COMMIT; ``` > 如果上述两个 `UPDATE` 操作中有一个失败(比如 `id=1` 的用户不存在),那么可以使用 `ROLLBACK` 回滚。 --- ### 示例 2:事务回滚 ```sql START TRANSACTION; UPDATE users SET balance = balance - 100 WHERE id = 1; -- 假设这里发生了错误(例如:id=1 不存在) -- 所以我们回滚事务 ROLLBACK; ``` > 在这个例子中,即使第一个 `UPDATE` 成功执行,也会被回滚,因为没有执行 `COMMIT`。 --- ## ⚠️ 注意事项 1. **默认自动提交模式** MySQL 默认是 **自动提交(autocommit)** 模式,即每条 SQL 语句都会被当作一个独立的事务执行,并在执行后自动提交。 > 可以通过 `SHOW VARIABLES LIKE 'autocommit';` 查看当前状态。 要关闭自动提交,使用: ```sql SET autocommit = 0; ``` 2. **事务需要支持事务的存储引擎** MySQL 支持事务的存储引擎有: - InnoDB(推荐) - NDB(用于 Cluster) MyISAM 不支持事务! 3. **事务不能包含 DDL 语句(如 CREATE, ALTER, DROP)** 在事务中执行 `CREATE TABLE` 或 `ALTER TABLE` 等语句会导致事务自动提交。 4. **事务中的 SELECT 语句不会影响事务的提交或回滚** 但如果你使用了 `SELECT ... FOR UPDATE`,会加锁,可能影响并发行为。 --- ## 🔄 事务的 ACID 特性 | 特性 | 说明 | |------|------| | **原子性(Atomicity)** | 事务内的所有操作要么全部成功,要么全部失败。 | | **一致性(Consistency)** | 事务执行前后,数据库的完整性约束(如主键、外键)保持一致。 | | **隔离性(Isolation)** | 多个事务并发执行时,彼此之间互不干扰。 | | **持久性(Durability)** | 一旦事务提交,其结果将永久保存在数据库中。 | --- ## 📌 总结 | 操作 | 说明 | |------|------| | `START TRANSACTION;` | 开始一个事务 | | `COMMIT;` | 提交事务,保存更改 | | `ROLLBACK;` | 回滚事务,撤销未提交的更改 | | `SET autocommit = 0;` | 关闭自动提交(适用于事务处理) | --- ## ✅ 最佳实践建议 - 在进行多表更新、转账等关键操作时,使用事务保证数据一致性。 - 在代码中使用事务时,尽量在异常捕获块中调用 `ROLLBACK`。 - 使用 `InnoDB` 存储引擎,因为它支持事务。 --- 如果你有具体的使用场景或问题,欢迎继续提问!
上一篇:
mysql COMMIT 操作指令
下一篇:
MySQL索引类型一览 让MySQL高效运行起来
标题录入,一次不能超过6条
返回顶部
留言
留言
评论