事务是一组连续的数据库操作操作,它被执行并被视为一个单独的工作单元.换句话说,当所有操作都成功执行时,只有整个事务才会完成.如果交易中的任何操作失败,则整个交易将失败.
交易属性
基本上,交易支持4种标准属性.它们可以称为ACID属性.
Atomicity : 事务中的所有操作都成功执行,否则事务在失败时中止,之前的操作将回滚到先前的位置.
一致性 : 数据库在成功提交事务时正确更改状态.
隔离 : 它使交易能够独立运作并相互透明.
耐久性 : 如果系统出现故障,提交的事务的结果或效果仍然存在.
提交,回滚和保存点
这些关键字主要用于HSQLDB交易.
提交 : 始终应该通过执行COMMIT命令来完成成功的事务.
回滚 : 如果事务中发生故障,则应执行ROLLBACK命令以将事务中引用的每个表返回到其先前的状态.
Savepoint : 在要回滚的事务组中创建一个点.
示例
以下示例说明了事务概念以及提交,回滚和保存点.让我们考虑具有列id,名称,年龄,地址和薪水的客户表.
Id | 名称 | 年龄 | 地址 | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | 德里 | 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 NOTNULL, 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的示例
以下查询从age = 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 |
下面是一个示例查询,通过从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岁的客户的记录数据.回滚命令会在Customer表上回滚这些更改.
Savepoint的示例
当您可以将事务回滚到某个点而不回滚整个事务时,Savepoint是事务中的一个点.
让我们将同一个Customer表视为输入.
Id | 名称 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 150 0.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,以便您可以随时回滚到任何Savepoint以将相应的数据返回到其原始状态.
以下是一系列操作.
SAVEPOINT SP1;DELETE FROM CUSTOMERS WHERE ID = 1;SAVEPOINT SP2;DELETE FROM CUSTOMERS WHERE ID = 2;SAVEPOINT SP3;DELETE FROM CUSTOMERS WHERE ID = 3;
现在,您已经创建了三个Savepoint并删除了三个记录.在这种情况下,如果要回滚具有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 |+----+----------+-----+-----------+----------+
释放保存点
我们可以使用RELEASE命令释放Savepoint.以下是通用语法.
RELEASE SAVEPOINT SAVEPOINT_NAME;