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` 关闭。
事务是数据库管理系统的重要功能之一,合理使用事务可以确保数据的一致性和完整性。