📅  最后修改于: 2020-11-27 05:11:38             🧑  作者: Mango
事务是一组顺序的数据库操作,它们被执行并被视为一个单独的工作单元。换句话说,当所有操作成功执行后,只有整个事务才能完成。如果事务中的任何操作失败,则整个事务将失败。
基本上,事务支持4个标准属性。它们可以称为ACID属性。
原子性-事务中的所有操作均已成功执行,否则事务将在失败时中止,并且先前的操作将回滚到其先前位置。
一致性-成功提交事务后,数据库会正确更改状态。
隔离-它使事务能够独立运行并且彼此透明。
持久性-如果系统出现故障,则提交的事务的结果或效果将持续存在。
这些关键字主要用于HSQLDB事务。
提交-始终应通过执行COMMIT命令来完成成功的事务。
回滚-如果事务中发生故障,则应执行ROLLBACK命令以使事务中引用的每个表返回其先前状态。
保存点-在事务组中创建一个要回滚的点。
以下示例说明了事务概念以及提交,回滚和保存点。让我们考虑带有ID,名称,年龄,地址和薪水列的“客户”表。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
使用以下命令沿上述数据行创建客户表。
CREATE TABLE Customer (id INT NOT NULL, name VARCHAR(100) NOT NULL, age INT NOT
NULL, address VARCHAR(20), Salary INT, PRIMARY KEY (id));
Insert into Customer values (1, "Ramesh", 32, "Ahmedabad", 2000);
Insert into Customer values (2, "Karun", 25, "Delhi", 1500);
Insert into Customer values (3, "Kaushik", 23, "Kota", 2000);
Insert into Customer values (4, "Chaitanya", 25, "Mumbai", 6500);
Insert into Customer values (5, "Harish", 27, "Bhopal", 8500);
Insert into Customer values (6, "Kamesh", 22, "MP", 1500);
Insert into Customer values (7, "Murali", 24, "Indore", 10000);
以下查询从年龄为25的表中删除行,并使用COMMIT命令将这些更改应用到数据库中。
DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;
执行上述查询后,您将收到以下输出。
2 rows effected
成功执行以上命令后,通过执行以下给定命令来检查客户表的记录。
Select * from Customer;
执行上述查询后,您将收到以下输出。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 3 | kaushik | 23 | Kota | 2000 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
让我们考虑将相同的Customer表作为输入。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
这是示例查询,它通过从具有age = 25的表中删除记录,然后回滚数据库中的更改来说明回滚功能。
DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;
成功执行以上两个查询后,您可以使用以下命令查看Customer表中的记录数据。
Select * from Customer;
执行上述命令后,您将收到以下输出。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 2 | Karun | 25 | Delhi | 1500 |
| 3 | Kaushik | 23 | Kota | 2000 |
| 4 | Chaitanya| 25 | Mumbai | 6500 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
delete查询将删除其年龄= 25的客户的记录数据。Rollback命令将这些更改回滚到Customer表上。
当您可以将事务回滚到特定点而不回滚整个事务时,保存点就是事务中的一个点。
让我们考虑将相同的Customer表作为输入。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
让我们考虑在此示例中,您计划从“客户”表中删除三个不同的记录。您想要在每次删除之前创建一个保存点,以便您可以随时回滚到任何保存点,以将适当的数据返回到其原始状态。
这是一系列操作。
SAVEPOINT SP1;
DELETE FROM CUSTOMERS WHERE ID = 1;
SAVEPOINT SP2;
DELETE FROM CUSTOMERS WHERE ID = 2;
SAVEPOINT SP3;
DELETE FROM CUSTOMERS WHERE ID = 3;
现在,您已经创建了三个保存点并删除了三个记录。在这种情况下,如果要回滚具有ID 2和3的记录,请使用以下回滚命令。
ROLLBACK TO SP2;
请注意,自从您回滚到SP2以来,只进行了第一次删除。使用以下查询显示客户的所有记录。
Select * from Customer;
执行上述查询后,您将收到以下输出。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 2 | Karun | 25 | Delhi | 1500 |
| 3 | Kaushik | 23 | Kota | 2000 |
| 4 | Chaitanya| 25 | Mumbai | 6500 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
我们可以使用RELEASE命令释放保存点。以下是通用语法。
RELEASE SAVEPOINT SAVEPOINT_NAME;