SQL 提交 和 回滚

一、SQL 提交 和 回滚 介绍

Commit(提交)和Rollback(回滚)是 SQL 中的事务控制命令。

连续执行的所有命令,被视为单个工作单元并称为事务。

如果你想保存一个事务中执行的所有命令,那么在事务完成后,你必须执行提交命令。该命令将保存在表上执行的所有命令。对表所做的所有这些更改都将永久保存到磁盘中。

每当在 SQL 中执行 commit 命令时,我们对表进行的所有更新都会上传到服务器,因此我们的工作将被保存。

rollback命令用于恢复表之前的永久状态,该状态由 commit 命令保存。

假设我们已经开始编辑一个表格,后来认为我们最近对表格进行的更改是不需要的。然后,在这种情况下,我们可以回滚我们的事务,这只是意味着回到表之前的永久状态,这是由 commit 命令保存的。

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

二、SQL 提交 和 回滚 示例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 查询以验证所有记录是否已成功插入到学生表中。

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命令来查看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

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

现在,编写一个查询来更新记录,并将 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

现在,我们将再次回滚事务并执行选择查询:

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

我们可以看到,在应用更新查询之前,所有记录都像以前一样被检索到。 

三、SQL 提交 和 回滚 示例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 查询以验证所有记录是否已成功插入到员工表中。

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的记录之前,我们已经存储了整个员工表,其中包含 5 条记录,使用 commit 命令存入磁盘。

我们将执行 ROLLBACK 命令来获取我们在执行 insert 命令之前保存的原始表。

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

我们可以看到,在应用插入查询之前,所有记录都像之前一样被检索。 

热门文章

优秀文章