SQL TCL命令
- 在SQL中,TCL代表 事务控制语言 。
- 数据库中的一个单独的工作单元在连续执行命令之后形成,被称为事务。
- SQL中存在着某些命令,被称为TCL命令,它们帮助用户管理数据库中发生的事务。
- COMMIT. ROLLBACK 和 SAVEPOINT 是SQL中最常用的TCL命令。
现在让我们通过示例来深入了解SQL的TCL命令。所有示例中的查询将使用MySQL数据库编写。
1. COMMIT
SQL中的COMMIT命令用于将所有与事务相关的更改永久保存到磁盘中。当使用DDL命令(如INSERT、UPDATE和DELETE)时,这些命令所做的更改只有在关闭当前会话后才是永久的。因此,在关闭会话之前,我们可以轻松地回滚DDL命令所做的更改。因此,如果我们希望在不关闭会话的情况下将更改永久保存到磁盘中,我们将使用commit命令。
语法:
COMMIT;
示例:
我们将选择一个现有的数据库,即school。
mysql> USE school;
要创建名为t_school的表,我们将执行以下查询:
mysql> CREATE TABLE t_school(ID INT, School_Name VARCHAR(40), Number_Of_Students INT, Number_Of_Teachers INT, Number_Of_Classrooms INT, EmailID VARCHAR(40));
开始/启动事务命令用于启动事务。
mysql> START TRANSACTION;
现在,我们将执行以下查询,在t_school表中同时插入多条记录。
mysql> INSERT INTO t_school(ID, School_Name, Number_Of_Students, Number_Of_Teachers, Number_Of_Classrooms, EmailID) VALUES(1, "Boys Town Public School", 1000, 80, 12, "btps15@gmail.com"), (2, "Guru Govind Singh Public School", 800, 35, 15, "ggps25@gmail.com"), (3, "Delhi Public School", 1200, 30, 10, "dps101@gmail.com"), (4, "Ashoka Universal School", 1110, 40, 40, "aus17@gmail.com"), (5, "Calibers English Medium School", 9000, 31, 50, "cems@gmail.com");
我们将现在执行SELECT查询来验证上面执行的INSERT INTO查询的执行情况。
mysql> SELECT *FROM t_school;
在对t_school表执行SELECT查询后,您将获得以下输出:
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
SELECT查询的输出显示所有记录都成功插入。
我们将执行COMMIT命令以保存对t_school表进行的操作的结果。
mysql> COMMIT;
MySQL中默认启用自动提交。要关闭它,我们将把autocommit的值设置为0。
mysql> SET autocommit = 0;
MySQL默认情况下会对用户执行的每个查询进行提交。但是,如果用户希望只提交特定的查询而不是每个查询,那么关闭自动提交功能就很有用。
2. SAVEPOINT
我们可以将数据库操作分为几个部分。例如,我们可以将我们将连续执行的所有插入相关的查询视为事务的一部分,将删除命令视为事务的另一部分。使用SQL中的SAVEPOINT命令,我们可以使用不同的名称保存同一事务的不同部分。
例如 ,我们可以使用名为INS的保存点保存所有插入相关的查询。为了将所有插入相关的查询保存在一个保存点中,在完成插入命令执行之后,我们必须执行SAVEPOINT查询,然后跟随保存点名称。
语法:
SAVEPOINT savepoint_name;
3. ROLLBACK
在执行事务时,我们必须创建保存点来保存事务的不同部分。根据用户的不同要求,他/她可以将事务回滚到不同的保存点。 考虑以下情况:我们启动了一个事务,然后创建了一个表并将记录插入到表中。在插入记录后,我们创建了一个保存点INS。然后我们执行了一个删除查询,但后来我们认为我们错误地删除了有用的记录。因此,在这种情况下,我们有一个回滚事务的选项。在这种情况下,我们必须使用ROLLBACK命令将事务回滚到我们在执行DELETE查询之前创建的保存点INS。
语法:
ROLLBACK TO savepoint_name;
了解SAVEPOINT和ROLLBACK命令的示例:
示例1:
我们将选择一个现有的数据库,即school。
mysql> USE school;
创建一个名为t_school的表,我们将执行以下查询:
mysql> CREATE TABLE t_school(ID INT, School_Name VARCHAR(40), Number_Of_Students INT, Number_Of_Teachers INT, Number_Of_Classrooms INT, EmailID VARCHAR(40));
现在,我们将执行以下查询,将多条记录同时插入到t_school表中。
mysql> INSERT INTO t_school(ID, School_Name, Number_Of_Students, Number_Of_Teachers, Number_Of_Classrooms, EmailID) VALUES(1, "Boys Town Public School", 1000, 80, 12, "btps15@gmail.com"), (2, "Guru Govind Singh Public School", 800, 35, 15, "ggps25@gmail.com"), (3, "Delhi Public School", 1200, 30, 10, "dps101@gmail.com"), (4, "Ashoka Universal School", 1110, 40, 40, "aus17@gmail.com"), (5, "Calibers English Medium School", 9000, 31, 50, "cems@gmail.com");
我们现在将执行SELECT查询以验证上面执行的INSERT INTO查询的执行情况。
mysql> SELECT *FROM t_school;
在t_school表上执行SELECT查询后,您将获得以下输出:
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
SELECT查询的输出显示所有记录已成功插入。
BEGIN / START TRANSACTION命令用于启动事务。
mysql> START TRANSACTION;
正如我们所知,SQL中的SAVEPOINT命令用于使用不同的名称保存同一事务的不同部分。将当前点视为我们事务的一部分。我们将使用名为Insertion的保存点来保存这一部分。
mysql> SAVEPOINT Insertion;
现在,我们将在t_school表上执行更新命令,将ID为5的记录的Number_Of_Students设置为9050。
mysql> UPDATE t_school SET Number_Of_Students = 9050 WHERE ID = 5;
要验证ID为5的记录现在Number_Of_Students为9050,我们将执行SELECT查询。
mysql> SELECT *FROM t_school;
执行对t_school表的SELECT查询后,您将获得以下输出:
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9050 | 31 | 50 | cems@gmail.com |
SELECT查询的输出显示ID为5的记录已成功更新。
将更新操作视为事务的一部分。我们将使用名为Updation的保存点保存此部分。
mysql> SAVEPOINT Updation;
突然间,我们的需求发生了变化,我们意识到我们已经更新了一个不应该更新的记录。在这种情况下,我们需要将事务回滚到保存点,这个保存点是在执行更新命令之前创建的。
mysql> ROLLBACK TO Insertion;
我们不需要记录上的更新。因此,我们已经回滚到名为Insertion的保存点。
为了确认我们得到了与执行更新操作之前的相同的t_school表,我们将再次执行SELECT查询。
mysql> SELECT *FROM t_school;
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.comm |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.comm |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.comm |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.comm |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
SELECT查询的输出确认了事务已成功回滚到保存点’Insertion’。
示例2:
我们将选择一个现有的数据库,即bank。
mysql> USE bank;
要创建一个名为customer的表格,我们将执行以下查询:
mysql> CREATE TABLE customer(Customer_ID INT PRIMARY KEY, Name VARCHAR(20), Age INT, Salary INT, Salary_BankAccount VARCHAR(20));
现在,我们将执行以下查询,以一次在客户表中插入多条记录。
mysql> INSERT INTO customer(Customer_ID, Name, Age, Salary, Salary_BankAccount) VALUES(1, "Aryan Jain", 51, 56000, "SBI"), (2, "Arohi Dixit", 21, 25000, "Axis"), (3, "Vineet Garg", 24, 31000, "ICICI"), (4, "Anuja Sharma", 26, 49000, "HDFC"), (5, "Deepak Kohli", 28, 65000, "SBI");
我们现在将执行SELECT查询来验证上面执行的INSERT INTO查询的执行情况。
mysql> SELECT *FROM customer;
在对t_school表执行SELECT查询之后,您将获得以下输出:
Customer_ID | Name | Age | Salary | Salary_BankAccount |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
5 | Deepak Kohli | 28 | 65000 | SBI |
SELECT查询的输出显示所有记录都成功插入。
BEGIN / START TRANSACTION命令用于开始事务。
mysql> START TRANSACTION;
正如我们所知,SQL中的SAVEPOINT命令用于使用不同的名称保存同一事务的不同部分。将此点之前的内容视为我们事务的一部分,我们将使用名为Insertion的保存点保存这一部分。
mysql> SAVEPOINT Insertion;
我们将在customer表上执行删除命令,以删除ID为5的记录。
mysql> DELETE FROM customer WHERE Customer_ID = 5;
我们将执行SELECT查询以验证ID为5的记录是否已被删除。
mysql> SELECT *FROM customer;
Customer_ID | Name | Age | Salary | Salary_BankAccount |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
SELECT查询的输出显示成功删除了ID为5的记录。
将删除操作视为事务的一部分。我们会使用名为“删除”的保存点保存这一部分。
mysql> SAVEPOINT Deletion;
突然间,我们的需求发生了变化,我们意识到我们不应该删除一条记录。在这种情况下,我们需要回滚我们的事务到保存点,保存点是在执行删除命令之前创建的。
mysql> ROLLBACK TO Insertion;
我们不需要记录上的删除。因此,我们已经回滚到保存点的命名为插入。
为了确认我们得到了与执行删除操作之前相同的客户表,我们将再次执行SELECT查询。
mysql> SELECT *FROM customer;
Customer_ID | Name | Age | Salary | Salary_BankAccount |
---|---|---|---|---|
1 | Aryan Jain | 51 | 56000 | SBI |
2 | Arohi Dixit | 21 | 25000 | Axis |
3 | Vineet Garg | 24 | 31000 | ICICI |
4 | Anuja Sharma | 26 | 49000 | HDFC |
5 | Deepak Kohli | 28 | 65000 | SBI |
查询的输出表明事务现在已成功回滚到保存点 ‘Insertion’。