SQL 中的 Commit 和 Rollback

17 Mar 2025 | 6 分钟阅读
  • COMMIT 和 ROLLBACK 是 SQL 中的事务控制命令
  • 所有连续执行的命令被视为一个工作单元,并称为事务。
  • 如果您想保存事务中执行的所有命令,那么在完成事务后,您必须执行commit命令。此命令将保存对表执行的所有命令。对表的所有这些更改都将永久保存在磁盘上。
  • 每当在 SQL 中执行 commit 命令时,我们对表进行的所有更新都将被上传到服务器,从而保存我们的工作。
  • rollback命令用于恢复到由 commit 命令保存的表的先前永久状态。
  • 假设我们开始编辑一个表,然后想到我们最近对表所做的更改是不需要的。在这种情况下,我们可以回滚我们的事务,这意味着恢复到由 commit 命令保存的表的先前永久状态。

注意:关于 rollback 命令需要注意的一点是,如果您已经提交了最近的更改,则无法回滚您的事务。在这种情况下,您只能回滚到上一个永久更改。

让我们看几个实际的例子来更清楚地理解这个概念。我们将使用 MySQL 数据库来编写所有查询。

示例 1

让我们选择现有的数据库 dbs。

然后我们将编写以下查询在 'dbs' 数据库中创建一个表


Commit and Rollback in SQL

然后,我们将使用 BEGIN / START TRANSACTION 命令开始我们的事务。


Commit and Rollback in SQL

现在,我们将插入 student 表的记录。


Commit and Rollback in SQL

我们将执行 SELECT 查询以验证所有记录是否已成功插入 student 表。

您将获得以下表格作为输出:

ID名称百分比地点出生日期
1Manthan Koli79德里2003-08-20
2Dev Dixit75Pune1999-06-17
3Aakash Deshmukh87孟买1997-09-12
4Aaryan Jaiswal90金奈2005-10-02
5Rahul Khanna92Ambala1996-03-04

我们将提交我们的事务以将所有更改永久保存到磁盘。


Commit and Rollback in SQL

现在,通过将 auto-commit 的值设置为 0 来关闭自动提交。


Commit and Rollback in SQL

然后我们将删除 ID 为 5 的 student 记录。


Commit and Rollback in SQL

为了验证 delete 查询的结果,我们将再次使用 SELECT 查询。


ID名称百分比地点出生日期
1Manthan Koli79德里2003-08-20
2Dev Dixit75Pune1999-06-17
3Aakash Deshmukh87孟买1997-09-12
4Aaryan Jaiswal90金奈2005-10-02

之后,我们认为我们需要之前删除的记录,即 ID 为 5 的记录。如我们所知,在删除 ID 为 5 的记录之前,我们已将包含五条记录的整个 student 表通过 commit 命令存储到磁盘。

我们将执行 ROLLBACK 命令以恢复在执行 delete 命令之前保存的原始表。


Commit and Rollback in SQL

在 rollback 命令之后,我们需要执行 SELECT 命令来查看 student 表的记录。


ID名称百分比地点出生日期
1Manthan Koli79德里2003-08-20
2Dev Dixit75Pune1999-06-17
3Aakash Deshmukh87孟买1997-09-12
4Aaryan Jaiswal90金奈2005-10-02
5Rahul Khanna92Ambala1996-03-04

以上结果表明,在使用 rollback 命令后,成功从磁盘检索了包含五条记录的 student 表。

现在,编写一个查询来更新记录,并将 ID 为 1 的 student 的 percentage 设置为 80。


Commit and Rollback in SQL

为了验证 update 查询的结果,我们将再次使用 SELECT 查询。在这里,此 update 查询将应用于回滚命令后检索的表。


ID名称百分比地点出生日期
1Manthan Koli80德里2003-08-20
2Dev Dixit75Pune1999-06-17
3Aakash Deshmukh87孟买1997-09-12
4Aaryan Jaiswal90金奈2005-10-02
5Rahul Khanna92Ambala1996-03-04

现在,我们将再次回滚我们的事务并执行 select 查询


Commit and Rollback in SQL

ID名称百分比地点出生日期
1Manthan Koli79德里2003-08-20
2Dev Dixit75Pune1999-06-17
3Aakash Deshmukh87孟买1997-09-12
4Aaryan Jaiswal90金奈2005-10-02
5Rahul Khanna92Ambala1996-03-04

我们可以看到所有记录都恢复到了应用 update 查询之前的状态。

示例 2

让我们选择现有的数据库 dbs。

现在我们将编写以下查询在 'dbs' 数据库中创建一个表


Commit and Rollback in SQL

然后,我们将使用 BEGIN / START TRANSACTION 命令开始我们的事务。


Commit and Rollback in SQL

现在,我们将插入 employee 表的记录。


Commit and Rollback in SQL

我们将执行 SELECT 查询以验证所有记录是否已成功插入 employee 表。

我们将得到如下表作为输出

ID名称城市薪金年龄
1Priyanka BagulNasik2600020
2Riya Sharma孟买7200028
3Neha Verma瓦拉纳西3700019
4Neeta DesaiNasik3950021
5Priya WaghUdaipur6000032

我们将提交我们的事务以将所有更改永久保存到磁盘。


Commit and Rollback in SQL

现在,通过将 auto-commit 的值设置为 0 来关闭自动提交。


Commit and Rollback in SQL

然后我们将向 employee 表添加一条新记录。


Commit and Rollback in SQL

为了验证 insert 查询的结果,我们将再次使用 SELECT 查询。


ID名称城市薪金年龄
1Priyanka BagulNasik2600020
2Riya Sharma孟买7200028
3Neha Verma瓦拉纳西3700019
4Neeta DesaiNasik3950021
5Priya WaghUdaipur6000032
6Sneha TiwariKanpur3800038

之后,我们认为我们不需要之前插入的记录,即 ID 为 6 的记录。如我们所知,在插入 ID 为 6 的记录之前,我们已将包含五条记录的整个 employee 表通过 commit 命令存储到磁盘。

我们将执行 ROLLBACK 命令以恢复在执行 insert 命令之前保存的原始表。


Commit and Rollback in SQL

在 rollback 命令之后,我们需要执行 SELECT 命令来查看 employee 表的记录。


ID名称城市薪金年龄
1Priyanka BagulNasik2600020
2Riya Sharma孟买7200028
3Neha Verma瓦拉纳西3700019
4Neeta DesaiNasik3950021
5Priya WaghUdaipur6000032

我们可以看到所有记录都恢复到了应用 insert 查询之前的状态。


下一个主题SQL Concatenate