SQL中如何进行 ‘’撤销‘’ 操作-详解

news/2024/12/22 0:40:14/

在 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;
-- 更改被提交

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


http://www.ppmy.cn/news/1537067.html

相关文章

【AI大模型】深入Transformer架构:编码器部分的实现与解析(下)

目录 🍔 编码器介绍 🍔 前馈全连接层 2.1 前馈全连接层 2.2 前馈全连接层的代码分析 2.3 前馈全连接层总结 🍔 规范化层 3.1 规范化层的作用 3.2 规范化层的代码实现 3.3 规范化层总结 🍔 子层连接结构 4.1 子层连接结…

python 实现graph matrix图矩阵算法

graph matrix图矩阵算法介绍 Graph Matrix(图矩阵)算法主要用于表示和处理图结构中的数据,尤其是在计算机科学和数学中。图矩阵通常指的是图的邻接矩阵(Adjacency Matrix),它是一种用矩阵表示图中顶点之间…

【可答疑】基于51单片机的PWM控制智能台灯设计(含仿真、代码、报告、演示视频等)

✨哈喽大家好,这里是每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~ 🐱‍🐉这是51单片机毕业设计100篇…

C++面试速通宝典——20

355. C生成子类需要虚析构么? ‌‌‌‌  是的。如果你的C类设计为基类,并且你打算通过基类指针来删除派生类的对象,那么你应该为基类提供一个虚析构函数。这样做可以确保在删除基类指针时,派生类的析构函数会被正确调用&#x…

SafeLine - 雷池 - 不让黑客越过半步

👋 项目介绍 SafeLine,中文名 “雷池”,是一款简单好用, 效果突出的 Web 应用防火墙(WAF),可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL …

云原生日志ELK( logstash安装部署)

logstash 介绍 LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机 (JVM)上。不同于分离的代理端(agent)或主机端(server)&…

State of ChatGPT ---- ChatGPT的技术综述

声明:该文总结自AI菩萨Andrej Karpathy在youtube发布的演讲视频。 原视频连接:State of GPT | BRK216HFS 基础知识: Transformer原文带读与代码实现https://blog.csdn.net/m0_62716099/article/details/141289541?spm1001.2014.3001.5501 H…

在线JSON可视化工具--支持缩放

先前文章提到的超好用的JSON可视化工具,收到反馈,觉得工具好用,唯一不足就是不能缩放视图,其实是支持的,因为滚轮有可能是往下滚动,会与缩放冲突,所以这个工具设计为需要双击视图来触发打开缩放…