在 SQL 中,撤销已经执行的操作通常涉及两个主要的概念:事务控制和回滚操作。

### 1. 事务控制
在支持事务的数据库管理系统(如 MySQL 的 InnoDB 引擎)中,您可以使用事务来确保数据的完整性。事务可以确保一系列的操作要么全部成功,要么全部失败。

- **开启事务**:

  START TRANSACTION;

- **提交事务**(使所有更改永久生效):

  COMMIT;

- **回滚事务**(撤销所有未提交的更改):

  ROLLBACK;

### 2. 回滚操作
如果您已经执行了一些更改(例如,通过 `INSERT`、`UPDATE` 或 `DELETE` 语句),并且希望撤销这些更改,您可以使用 `ROLLBACK` 语句。但是,请注意,只有那些在当前事务中的更改可以被回滚。如果您的更改已经通过 `COMMIT` 提交,那么它们将永久生效,无法通过 `ROLLBACK` 撤销。

### 示例
假设您在一个事务中执行了以下操作:

START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

如果您在提交事务之前发现第一个更新操作有误,您可以撤销所有未提交的更改:

ROLLBACK;

这将撤销这两个更新操作,因为它们都在同一个事务中。

### 注意事项
- 并非所有的数据库引擎都支持事务。例如,MySQL 的 MyISAM 引擎不支持事务。
- 在默认情况下,许多数据库系统(包括 MySQL)在每个单独的操作后自动提交事务。这意味着,如果您没有明确地开始一个事务,每个 `INSERT`、`UPDATE` 或 `DELETE` 语句都会立即生效并无法撤销。
- 为了能够撤销操作,确保您了解数据库的事务配置,并在必要时正确使用 `START TRANSACTION`、`COMMIT` 和 `ROLLBACK` 语句。

要在 MySQL 中使用 ROLLBACK 来撤销已经执行的语句,您需要先关闭自动提交模式,然后显式地管理事务。以下是详细步骤:

  1. 关闭自动提交模式: 您需要将 autocommit 变量设置为 0,这样就不会在每个语句执行后自动提交事务了。

    //查看事务的提交方式
    SHOW @@AUTOCOMMIT
    //设置事务的提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
    //默认是为1 即自动提交,所以平常执行的sql语句都是自动提交的
    SET autocommit = 0;
  2. 执行 SQL 语句: 在关闭自动提交模式后,您可以执行多个 SQL 语句,这些语句的更改不会立即生效,而是会保持在当前事务中。

    UPDATE table_name SET column_name = 'new_value' WHERE condition;
    -- 更改尚未提交,可以在此时使用 ROLLBACK 或 COMMIT
    
        在当前事务中,你可以查询 table_name 表,并看到更新后的结果。
        其他事务或会话查询同一 table_name 表时,看不到这些更改,因为更改还没有被提交
  3. 使用 ROLLBACK 撤销更改: 如果您发现需要撤销事务中的更改,可以使用 ROLLBACK 语句。这将撤销当前事务中的所有更改。

    ROLLBACK;
    -- 所有更改被撤销,数据恢复到事务开始前的状态
  4. 使用 COMMIT 提交更改: 如果您确认事务中的更改是正确的,可以使用 COMMIT 语句来提交这些更改,使它们永久生效。

    COMMIT;
    -- 更改被提交,无法再使用 ROLLBACK 撤销
  5. 重新开启自动提交模式(可选): 如果您完成事务管理后,想要恢复自动提交模式,可以再次将 autocommit 变量设置为 1

    SET autocommit = 1;

示例

以下是一个完整的示例,展示如何使用 ROLLBACK 来撤销更改:

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

-- 开始事务
START TRANSACTION;

-- 执行更新操作//执行完后只有当前的会话中可以查看执行结果,他是没真正的提交,
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 检查操作是否正确,如果需要撤销
ROLLBACK;
-- 所有更改被撤销

-- 如果操作正确,可以提交事务//提交了就不能更改了
COMMIT;
-- 更改被提交

通过这种方式,您可以更灵活地管理数据库事务,确保数据的完整性和一致性。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部