Hsqldb 简明教程
HSQLDB - Transactions
Transaction 是数据库操作的顺序组,它被执行并认为是一个单一的工作单元。换句话说,当所有操作都成功执行时,整个事务才会完成。如果事务中的任何操作失败,那么整个事务将会失败。
Properties of Transactions
基本上,事务支持 4 个标准属性。它们可以称为 ACID 属性。
Atomicity − 事务中的所有操作都成功执行,否则事务将在失败时中止,并且先前的操作回滚到它们先前的状态。
Consistency − 成功提交事务后,数据库将适当地更改状态。
Isolation − 它使事务能够独立操作,彼此透明。
Durability − 在系统故障的情况下,已提交事务的结果或影响会持久存在。
Commit, Rollback, and Savepoint
这些关键字主要用于 HSQLDB 事务。
Commit − 始终应通过执行 COMMIT 命令来完成成功的的事务。
Rollback − 如果事务中出现故障,则应执行 ROLLBACK 命令,以便将事务中引用的所有表返回到其先前状态。
Savepoint - 在交易组内创建一个回滚点。
Example
下面这个示例将解释交易的概念以及提交、回滚和保存点。让我们考虑一下表 Customers 以及列 id、name、age、address 和 salary。
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);
Example for COMMIT
下面这个查询会删除表中 age = 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 |
+----+----------+-----+-----------+----------+
Example for Rollback
让我们考虑同样的 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 |
这里有一个示例查询可以解释 Rollback 功能,具体是通过删除表中 age = 25 的记录然后 ROLLBACK 数据库中的改动。
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 的客户的记录数据。Rollback 命令会回滚 Customer 表上的那些改动。
Example for Savepoint
保存点是事务中的一个点,你可以在此点回滚事务到某个点,而不回滚整个事务。
让我们考虑同样的 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 |
让我们在本例中考虑一下,你计划删除 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 命令。
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 |
+----+----------+-----+-----------+----------+