HSQLDB 事务
A
Transaction 是一组连续的数据库操作操作,它被执行并被视为一个单独的工作单元。换句话说,当所有操作都成功执行后,整个事务才会完成。如果事务中的任何操作失败,那么整个事务都将失败。
事务属性
基本上,事务支持 4 个标准属性。它们可以称为 ACID 属性。
原子性-事务中的所有操作都成功执行,否则事务会在失败点中止,并且之前的操作会回滚到之前的位置。
一致性-数据库在成功提交事务后正确更改状态。
隔离-它使事务能够独立运行且彼此透明。
持久性-提交事务的结果或影响在系统出现故障的情况下仍然存在。
提交、回滚和保存点
这些关键字主要用于HSQLDB事务。
Commit-总是成功的事务应该通过执行 COMMIT 命令来完成。
Rollback-如果事务发生故障,则应执行 ROLLBACK 命令以将事务中引用的每个表返回到其先前状态。
Savepoint-在要回滚的事务组中创建一个点。
示例
以下示例解释了事务概念以及提交、回滚和保存点。让我们考虑包含列 id、姓名、年龄、地址和薪水的客户表。
Id |
名称 |
年龄 |
地址 |
薪资 |
1 |
拉梅什 |
32 |
艾哈迈达巴德 |
2000.00 |
2 |
卡伦 |
25 |
德里 |
1500.00 |
3 |
考西克 |
23 |
哥打 |
2000.00 |
4 |
柴坦尼亚 |
25 |
孟买 |
6500.00 |
5 |
苦涩 |
27 |
博帕尔 |
8500.00 |
6 |
卡梅什 |
22 |
议员 |
1500.00 |
7 |
壁画 |
24 |
印多尔 |
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;
执行上述查询后,您将收到以下输出。
成功执行上述命令后,通过执行下面给定的命令检查客户表的记录。
执行上述查询后,您将收到以下输出。
+----+----------+-----+-----------+----------+
| 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 |
拉梅什 |
32 |
艾哈迈达巴德 |
2000.00 |
2 |
卡伦 |
25 |
德里 |
1500.00 |
3 |
考西克 |
23 |
哥打 |
2000.00 |
4 |
柴坦尼亚 |
25 |
孟买 |
6500.00 |
5 |
苦涩 |
27 |
博帕尔 |
8500.00 |
6 |
卡梅什 |
22 |
议员 |
1500.00 |
7 |
壁画 |
24 |
印多尔 |
10000.00 |
以下是通过从表中删除年龄 = 25 的记录然后回滚数据库中的更改来解释回滚功能的示例查询。
DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;
成功执行以上两个查询后,可以使用以下命令查看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 表作为输入。
Id |
名称 |
年龄 |
地址 |
薪资 |
1 |
拉梅什 |
32 |
艾哈迈达巴德 |
2000.00 |
2 |
卡伦 |
25 |
德里 |
1500.00 |
3 |
考西克 |
23 |
哥打 |
2000.00 |
4 |
柴坦尼亚 |
25 |
孟买 |
6500.00 |
5 |
苦涩 |
27 |
博帕尔 |
8500.00 |
6 |
卡梅什 |
22 |
议员 |
1500.00 |
7 |
壁画 |
24 |
印多尔 |
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 的记录,请使用以下回滚命令。
请注意,自从您回滚到 SP2 后,只发生了第一次删除。使用以下查询显示客户的所有记录。
执行上述查询后,您将收到以下输出。
+----+----------+-----+-----------+----------+
| 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;