在SQL中提交和回滚
- 提交和回滚是SQL中的事务控制命令。
- 所有连续执行的命令都被视为一个单独的工作单元,并称为事务。
- 如果你想保存在事务中执行的所有命令,那么在完成事务后,你必须执行提交命令。这个命令将保存在表上执行的所有命令。所有对表的更改将永久保存到磁盘中。
- 每当在SQL中执行提交命令时,我们对表进行的所有更新都将上传到服务器,因此我们的工作将被保存。
- 回滚命令用于返回到由提交命令保存的上一个永久状态的表。
- 假设我们开始编辑一个表,然后认为我们最近在表上进行的更改不再需要。在这种情况下,我们可以回滚我们的事务,这意味着返回到由提交命令保存的上一个永久状态的表。
注意:关于回滚命令需要注意的一件事是,如果你已经提交了最近的更改,你不能回滚你的事务。在这种情况下,你只能回滚到上一个永久更改。
让我们看几个实际示例来更清楚地理解这个概念。我们将使用MySQL数据库编写所有的查询。
示例1:
让我们选择现有的数据库dbs。
mysql> USE dbs;
然后我们将编写以下查询语句在’dbs’数据库中创建一张表:
mysql> CREATE TABLE student(ID INT PRIMARY KEY, Name VARCHAR(20), Percentage INT, Location VARCHAR(20), DateOfBirth DATE);
然后,我们将使用BEGIN / START TRANSACTION命令开始我们的事务。
mysql> START TRANSACTION;
现在,我们将在学生表中插入记录。
mysql> INSERT INTO student(ID, Name, Percentage, Location, DateOfBirth) VALUES (1, "Manthan Koli", 79, "Delhi", "2003-08-20"), (2, "Dev Dixit", 75, "Pune", "1999-06-17"), (3, "Aakash Deshmukh", 87, "Mumbai", "1997-09-12"), (4, "Aaryan Jaiswal", 90, "Chennai", "2005-10-02"), (5, "Rahul Khanna", 92, "Ambala", "1996-03-04");
我们将执行SELECT查询以验证所有记录是否成功插入到student表中。
mysql> SELECT *FROM student;
您将获得以下表格作为输出:
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
我们将提交事务以将所有更改永久保存到磁盘上。
mysql> COMMIT;
现在,通过将auto-commit的值设置为0来关闭自动提交。
mysql> SET autocommit = 0;
然后我们将删除ID为5的学生记录。
mysql> DELETE FROM student WHERE ID = 5;
为了验证删除查询的结果,我们将再次使用SELECT查询。
mysql> SELECT *FROM employee;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
以后,我们认为我们需要删除之前步骤中删除的记录,即ID为5的记录。正如我们所知,在删除具有ID 5的记录之前,我们使用commit命令将包含五条记录的整个学生表存储到磁盘中。
我们将执行ROLLBACK命令以获取在执行删除命令之前保存的原始表格。
mysql> ROLLBACK;
在执行回滚命令后,我们需要执行SELECT命令来查看学生表的记录。
mysql> SELECT * FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
上述结果表明,在使用回滚命令之后,从磁盘成功检索到包含五条记录的学生表。
现在,编写一个查询来更新记录,并将ID为1的学生的百分比设置为80。
mysql> UPDATE student SET Percentage = 80 WHERE ID = 1;
验证更新查询结果,我们将再次使用SELECT查询。在这里,该更新查询将应用于回滚命令后检索到的表。
mysql> SELECT * FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 80 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
现在,我们将再次回滚事务并执行select查询:
mysql> ROLLBACK;
mysql> SELECT * FROM student;
ID | Name | Percentage | Location | DateOfBirth |
---|---|---|---|---|
1 | Manthan Koli | 79 | Delhi | 2003-08-20 |
2 | Dev Dixit | 75 | Pune | 1999-06-17 |
3 | Aakash Deshmukh | 87 | Mumbai | 1997-09-12 |
4 | Aaryan Jaiswal | 90 | Chennai | 2005-10-02 |
5 | Rahul Khanna | 92 | Ambala | 1996-03-04 |
我们可以看到,所有的记录在应用更新查询之前都被检索出来了。
例子2:
让我们选择现有的数据库dbs。
mysql> USE dbs;
现在我们将编写以下查询来在“dbs”数据库中创建一个表:
mysql> CREATE TABLE employee(ID INT, Name VARCHAR(20), City VARCHAR(20), Salary INT, Age INT);
然后,我们将使用BEGIN / START TRANSACTION命令来启动我们的事务。
mysql> START TRANSACTION;
现在,我们将在员工表中插入记录。
mysql> INSERT INTO employee( ID, Name, City, Salary, Age) VALUES( 1, "Priyanka Bagul", "Nasik", 26000, 20), (2, "Riya Sharma", "Mumbai", 72000, 28), (3, "Neha Verma", "Varanasi", 37000, 19), (4, "Neeta Desai", "Nasik", 39500, 21), (5, "Priya Wagh", "Udaipur", 60000, 32);
我们将执行SELECT查询来验证所有记录是否成功插入employee表中。
mysql> SELECT *FROM employee;
我们会得到以下表格作为输出:
ID | Name | City | Salary | Age |
---|---|---|---|---|
1 | Priyanka Bagul | Nasik | 26000 | 20 |
2 | Riya Sharma | Mumbai | 72000 | 28 |
3 | Neha Verma | Varanasi | 37000 | 19 |
4 | Neeta Desai | Nasik | 39500 | 21 |
5 | Priya Wagh | Udaipur | 60000 | 32 |
我们将提交事务,将所有更改永久保存到磁盘中。
mysql> COMMIT;
现在,通过将auto-commit的值设置为0来关闭自动提交。
mysql> SET autocommit = 0;
然后我们将向员工表中添加一条新记录。
mysql> INSERT INTO employee VALUES (6, "Sneha Tiwari", "Kanpur", 38000, 38);
为了验证插入查询的结果,我们将再次使用SELECT查询。
mysql> SELECT *FROM employee;
ID | Name | City | Salary | Age |
---|---|---|---|---|
1 | Priyanka Bagul | Nasik | 26000 | 20 |
2 | Riya Sharma | Mumbai | 72000 | 28 |
3 | Neha Verma | Varanasi | 37000 | 19 |
4 | Neeta Desai | Nasik | 39500 | 21 |
5 | Priya Wagh | Udaipur | 60000 | 32 |
6 | Sneha Tiwari | Kanpur | 38000 | 38 |
以后,我们认为我们不需要我们在前一步中插入的记录,即其ID为6的记录。我们知道,在插入ID为6的记录之前,我们用commit命令将整个员工表(包含五条记录)存储到磁盘中。
我们将执行ROLLBACK命令,以获得在执行插入命令之前保存的原始表。
mysql> ROLLBACK;
在回滚命令之后,我们需要执行SELECT命令来查看员工表的记录。
mysql> SELECT *FROM employee;
ID | Name | City | Salary | Age |
---|---|---|---|---|
1 | Priyanka Bagul | Nasik | 26000 | 20 |
2 | Riya Sharma | Mumbai | 72000 | 28 |
3 | Neha Verma | Varanasi | 37000 | 19 |
4 | Neeta Desai | Nasik | 39500 | 21 |
5 | Priya Wagh | Udaipur | 60000 | 32 |
我们可以看到,在应用插入查询之前,所有记录都被检索出来,就像之前一样。