HSQLDB - 事务



一个事务是一系列数据库操作的顺序集合,它被执行并被视为一个单一的工作单元。换句话说,只有当所有操作都成功执行后,整个事务才算完成。如果事务中的任何操作失败,则整个事务都将失败。

事务的特性

基本上,事务支持4个标准特性。它们可以被称为ACID特性。

原子性 - 事务中的所有操作都成功执行,否则事务在失败点中止,之前的操作回滚到它们之前的状态。

一致性 - 数据库在成功提交的事务后正确地改变状态。

隔离性 - 它使事务能够独立地、透明地彼此运行。

持久性 - 提交的事务的结果或影响在系统故障的情况下仍然存在。

提交、回滚和保存点

这些关键字主要用于HSQLDB事务。

提交 - 成功的事务应该总是通过执行COMMIT命令来完成。

回滚 - 如果事务发生故障,则应执行ROLLBACK命令将事务中引用的每个表返回到其先前状态。

保存点 - 在事务组中创建一个回滚点。

示例

下面的例子解释了事务的概念以及提交、回滚和保存点。让我们考虑一个名为Customers的表,其列包括id、name、age、address和salary。

ID 姓名 年龄 地址 薪水
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

使用以下命令创建与上述数据类似的customer表。

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);

COMMIT示例

以下查询删除表中年龄为25的行,并使用COMMIT命令将这些更改应用到数据库。

DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;

执行上述查询后,您将收到以下输出。

2 rows effected

成功执行上述命令后,通过执行下面给出的命令检查customer表的记录。

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 姓名 年龄 地址 薪水
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

这是一个示例查询,它通过删除表中年龄为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  |
+----+----------+-----+-----------+----------+

删除查询删除了年龄为25的客户的记录数据。回滚命令回滚了对Customer表的这些更改。

保存点示例

保存点是事务中的一个点,您可以将事务回滚到某个点,而无需回滚整个事务。

让我们考虑相同的Customer表作为输入。

ID 姓名 年龄 地址 薪水
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

让我们在这个例子中考虑一下,您计划从Customers表中删除三个不同的记录。您希望在每次删除之前创建一个保存点,以便您可以随时回滚到任何保存点以将相应的数据返回到其原始状态。

这是一系列操作。

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;
广告
© . All rights reserved.