MySQL事务-ROLLBACK,COMMIT用法详解
在 MySQL 中,事务是通过一组 SQL 语句来操作数据库的逻辑单元。事务具有四个基本特性(ACID 特性):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。为了保证这些特性,MySQL 提供了事务控制语句 `COMMIT` 和 `ROLLBACK` 来管理事务。 ### 事务的基本概念 1. **开始事务**: - 默认情况下,MySQL 的存储引擎(如 InnoDB)支持事务。要显式地开始一个事务,可以使用 `START TRANSACTION` 或 `BEGIN`。 2. **提交事务**: - 使用 `COMMIT` 命令来提交事务,表示将事务中的所有更改永久保存到数据库中。 3. **回滚事务**: - 如果发生错误或需要撤销事务中的更改,可以使用 `ROLLBACK` 命令来撤销事务中所有的更改。 4. **自动提交模式**: - MySQL 默认处于自动提交模式(autocommit),即每条 SQL 语句都会立即提交到数据库中。可以通过设置 `SET autocommit=0` 来关闭自动提交模式,从而手动控制事务。 --- ### 事务控制语句详解 #### 1. `START TRANSACTION` 和 `BEGIN` - 这两个命令用于显式地开始一个新的事务。 - 示例: ```sql START TRANSACTION; -- 或者 BEGIN; ``` #### 2. `COMMIT` - 提交事务,将事务中的所有更改永久保存到数据库中。 - 示例: ```sql COMMIT; ``` - 注意:在默认的自动提交模式下,每个 SQL 语句都会被自动提交。如果需要手动控制事务,必须先关闭自动提交模式(`SET autocommit=0`)。 #### 3. `ROLLBACK` - 回滚事务,撤销事务中的所有更改。 - 示例: ```sql ROLLBACK; ``` - 当发生错误或需要撤销某些操作时,可以使用 `ROLLBACK` 来恢复到事务开始前的状态。 #### 4. `SAVEPOINT` - 在事务中设置保存点(savepoint),可以在事务中回滚到某个特定的点。 - 示例: ```sql SAVEPOINT my_savepoint; -- 执行一些操作... ROLLBACK TO SAVEPOINT my_savepoint; -- 撤销到保存点 RELEASE SAVEPOINT my_savepoint; -- 删除保存点 ``` --- ### 事务示例 以下是一个完整的事务示例,展示了如何使用 `COMMIT` 和 `ROLLBACK`: ```sql -- 关闭自动提交模式 SET autocommit = 0; -- 开始事务 START TRANSACTION; -- 插入数据 INSERT INTO users (id, name) VALUES (1, \'Alice\'); INSERT INTO users (id, name) VALUES (2, \'Bob\'); -- 检查插入结果 SELECT * FROM users; -- 如果发生错误,回滚事务 -- ROLLBACK; -- 提交事务 COMMIT; -- 查看最终结果 SELECT * FROM users; ``` --- ### 注意事项 1. **隔离级别**: - 事务的隔离性是由隔离级别决定的。MySQL 提供了多种隔离级别(如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE),可以通过 `SET TRANSACTION ISOLATION LEVEL` 设置。 2. **死锁**: - 在高并发环境下,事务可能会导致死锁。如果发生死锁,MySQL 会自动检测并回滚其中一个事务。 3. **自动提交模式**: - 如果需要手动控制事务,建议关闭自动提交模式(`SET autocommit=0`),并在事务完成后显式调用 `COMMIT` 或 `ROLLBACK`。 4. **事务日志**: - InnoDB 存储引擎会记录事务的日志,确保在崩溃或其他异常情况下能够恢复数据。 --- ### 总结 - `COMMIT`:提交事务,保存更改。 - `ROLLBACK`:回滚事务,撤销更改。 - `START TRANSACTION` 或 `BEGIN`:开始新事务。 - 自动提交模式可以通过 `SET autocommit=0` 关闭。 事务是数据库管理系统的重要功能之一,合理使用事务可以确保数据的一致性和完整性。