SQL 中的 TCL 命令

2025 年 2 月 2 日 | 8 分钟阅读
  • 在 SQL 中,TCL 代表 事务控制语言
  • 在数据库中,连续执行命令后形成的一个工作单元称为事务。
  • SQL 中存在一些 TCL 命令,它们帮助用户管理数据库中发生的事务。
  • COMMIT、ROLLBACKSAVEPOINT 是 SQL 中最常用的 TCL 命令。

现在让我们通过示例更深入地了解 SQL 的 TCL 命令。示例中的所有查询都将使用 MySQL 数据库编写。

1. COMMIT

SQL 中的 COMMIT 命令用于将所有与事务相关的更改永久保存到磁盘。每当使用 DDL 命令(如 INSERT、UPDATE 和 DELETE)时,这些命令所做的更改只有在关闭当前会话后才永久生效。因此,在关闭会话之前,可以轻松回滚 DDL 命令所做的更改。因此,如果要在不关闭会话的情况下将更改永久保存到磁盘,我们将使用 commit 命令。

语法

示例

我们将选择一个现有数据库,即 school。


TCL Commands in SQL

要创建一个名为 t_school 的表,我们将执行以下查询


TCL Commands in SQL

BEGIN / START TRANSACTION 命令用于启动事务。


TCL Commands in SQL

现在,我们将执行以下查询,同时在 t_school 表中插入多条记录。


TCL Commands in SQL

现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。

在 t_school 表上执行 SELECT 查询后,您将获得以下输出

ID学校名称学生人数教师人数教室数量电子邮件 ID
1Boys Town 公立学校10008012btps15@gmail.com
2Guru Govind Singh 公立学校8003515ggps25@gmail.com
3德里公立学校12003010dps101@gmail.com
4Ashoka 国际学校11104040aus17@gmail.com
5Calibers 英语中学90003150cems@gmail.com

SELECT 查询的输出显示所有记录都已成功插入。

我们将执行 COMMIT 命令来保存对 t_school 表执行的操作结果。


TCL Commands in SQL

MySQL 默认启用自动提交。要将其关闭,我们将把自动提交的值设置为 0。


TCL Commands in SQL

MySQL 默认会提交用户执行的每个查询。但如果用户希望只提交特定查询而不是提交每个查询,那么关闭自动提交会很有用。

2. SAVEPOINT

我们可以将数据库操作划分为多个部分。例如,我们可以将所有连续执行的插入相关查询视为事务的一部分,而删除命令视为事务的另一部分。使用 SQL 中的 SAVEPOINT 命令,我们可以使用不同的名称保存同一事务的这些不同部分。例如,我们可以使用名为 INS 的保存点保存所有插入相关查询。要将所有插入相关查询保存到一个保存点中,我们必须在完成插入命令执行后执行 SAVEPOINT 查询,后跟保存点名称。

语法

3. ROLLBACK

在执行事务时,我们必须创建保存点以保存事务的不同部分。根据用户不断变化的需求,他/她可以将事务回滚到不同的保存点。考虑一种情况:我们已经启动了一个事务,然后创建了表并将记录插入到表中。插入记录后,我们创建了一个名为 INS 的保存点。然后我们执行了一个删除查询,但后来我们认为我们不小心删除了有用的记录。因此,在这种情况下,我们有一个回滚事务的选项。在这种情况下,我们必须使用 ROLLBACK 命令将事务回滚到我们在执行 DELETE 查询之前创建的保存点 INS。

语法

理解 SAVEPOINT 和 ROLLBACK 命令的示例

示例 1

我们将选择一个现有数据库,即 school。


TCL Commands in SQL

要创建一个名为 t_school 的表,我们将执行以下查询


TCL Commands in SQL

现在,我们将执行以下查询,同时在 t_school 表中插入多条记录。


TCL Commands in SQL

现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。

在 t_school 表上执行 SELECT 查询后,您将获得以下输出

ID学校名称学生人数教师人数教室数量电子邮件 ID
1Boys Town 公立学校10008012btps15@gmail.com
2Guru Govind Singh 公立学校8003515ggps25@gmail.com
3德里公立学校12003010dps101@gmail.com
4Ashoka 国际学校11104040aus17@gmail.com
5Calibers 英语中学90003150cems@gmail.com

SELECT 查询的输出显示所有记录都已成功插入。

BEGIN / START TRANSACTION 命令用于启动事务。


TCL Commands in SQL

如我们所知,SQL 中的 SAVEPOINT 命令用于使用不同的名称保存同一事务的不同部分。将此点视为我们事务的一部分。我们将使用名为 Insertion 的保存点保存此部分。


TCL Commands in SQL

现在,我们将在 t_school 表上执行 update 命令,将 ID 为 5 的记录的 Number_Of_Students 设置为 9050。


TCL Commands in SQL

要验证 ID 为 5 的记录的 Number_Of_Students 现在是否为 9050,我们将执行 SELECT 查询。

在 t_school 表上执行 SELECT 查询后,您将获得以下输出

ID学校名称学生人数教师人数教室数量电子邮件 ID
1Boys Town 公立学校10008012btps15@gmail.com
2Guru Govind Singh 公立学校8003515ggps25@gmail.com
3德里公立学校12003010dps101@gmail.com
4Ashoka 国际学校11104040aus17@gmail.com
5Calibers 英语中学90003150cems@gmail.com

SELECT 查询的输出显示 ID 为 5 的记录已成功更新。

将更新操作视为我们事务的一部分。我们将使用名为 Updation 的保存点保存此部分。


TCL Commands in SQL

突然,我们的需求改变了,我们意识到我们更新了一条不应该更新的记录。在这种情况下,我们需要将事务回滚到在执行 UPDATE 命令之前创建的保存点。


TCL Commands in SQL

我们不需要对记录执行更新。因此,我们已回滚到名为 Insertion 的保存点。

为了确认我们已获得与执行更新操作之前相同的 t_school 表,我们将再次执行 SELECT 查询。


ID学校名称学生人数教师人数教室数量电子邮件 ID
1Boys Town 公立学校10008012btps15@gmail.com
2Guru Govind Singh 公立学校8003515ggps25@gmail.com
3德里公立学校12003010dps101@gmail.com
4Ashoka 国际学校11104040aus17@gmail.com
5Calibers 英语中学90003150cems@gmail.com

SELECT 查询输出确认事务现在已成功回滚到保存点“Insertion”。

示例 2

我们将选择一个现有数据库,即 bank。


TCL Commands in SQL

要创建一个名为 customer 的表,我们将执行以下查询


TCL Commands in SQL

现在,我们将执行以下查询,同时在 customer 表中插入多条记录。


TCL Commands in SQL

现在我们将执行 SELECT 查询,以验证上面执行的 INSERT INTO 查询的执行情况。

在 t_school 表上执行 SELECT 查询后,您将获得以下输出

客户 ID名称年龄薪金薪资_银行账户
1Aryan Jain5156000SBI
2Arohi Dixit2125000Axis
3Vineet Garg2431000ICICI
4Anuja Sharma2649000HDFC
5Deepak Kohli2865000SBI

SELECT 查询的输出显示所有记录都已成功插入。

BEGIN / START TRANSACTION 命令用于启动事务。


TCL Commands in SQL

如我们所知,SQL 中的 SAVEPOINT 命令用于使用不同的名称保存同一事务的不同部分。将此点视为我们事务的一部分。我们将使用名为 Insertion 的保存点保存此部分。


TCL Commands in SQL

我们将在 customer 表上执行 delete 命令,以删除 ID 为 5 的记录。


TCL Commands in SQL

我们将执行 SELECT 查询以验证 ID 为 5 的记录是否已删除。


客户 ID名称年龄薪金薪资_银行账户
1Aryan Jain5156000SBI
2Arohi Dixit2125000Axis
3Vineet Garg2431000ICICI
4Anuja Sharma2649000HDFC

SELECT 查询的输出显示 ID 为 5 的记录已成功删除。

将删除操作视为我们事务的一部分。我们将使用名为 Deletion 的保存点保存此部分。


TCL Commands in SQL

突然,我们的需求改变了,我们意识到我们删除了一条不应该删除的记录。在这种情况下,我们需要将事务回滚到在执行 DELETE 命令之前创建的保存点。

我们不需要对记录执行删除。因此,我们已回滚到名为 Insertion 的保存点。

为了确认我们已获得与执行删除操作之前相同的客户表,我们将再次执行 SELECT 查询。


客户 ID名称年龄薪金薪资_银行账户
1Aryan Jain5156000SBI
2Arohi Dixit2125000Axis
3Vineet Garg2431000ICICI
4Anuja Sharma2649000HDFC
5Deepak Kohli2865000SBI

SELECT 查询输出确认事务现在已成功回滚到保存点“Insertion”。


下一主题SQL 子查询