数据库中的事务管理
事务是在数据库上执行的工作的逻辑单位。它们是由终端用户或应用程序完成的逻辑上有序的工作单位。
一个事务是由一个或多个数据库的修改组成的。例如,从一个表中创建、更新或删除一条记录。为了保持数据的完整性和解决数据库问题,跟踪这些事务是至关重要的。我们可以将SQL查询捆绑在一起,作为一个单一的事务运行
前提条件
要继续学习本教程,你需要知道基本的SQL(结构化查询语言),并了解如何创建一个数据库。
事务状态
有各种数据库事务状态,如下所示。
- 活动状态- 这是事务执行过程开始的状态。在数据库上进行读或写等操作。
- 部分提交--意味着一个事务一旦完成,就只能部分提交。
- 提交阶段--在事务执行成功后,事务就处于提交状态。对数据库所做的所有改变都被永久记录下来。
- 失败状态- 如果一个事务在活动状态下被中止,或者其中一个检查失败,那么该事务就处于失败状态。
- 终止状态- 一旦事务离开系统不能再次重启,就会发生这种状态。
事务属性
事务有四个主要属性,用缩写ACID表示。这指的是Atomicity,Consistency,Isolation, 和Durability 。
- 原子性--事务不能被细分,只能作为一个整体来执行,并被视为一个原子单元。要么所有的操作都被执行,要么不执行。
- 一致性- 在数据库中执行任何事务后,它应该保持一致。任何事务都不应该对驻留在数据库中的数据产生不利影响。
- 隔离性- 当几个事务需要同时在数据库中进行时,每个事务都被当作是一个单一的事务。因此,单个事务的完成不应该对其他事务的完成产生影响。
- 持久性- 从持久性来看,所有的改变必须是永久性的,一旦事务被提交,事务的效果就不能被逆转。在系统故障或意外关机的情况下,一个完整的事务所做的改变没有写入磁盘,在重新启动时,这些改变应该被记住并恢复。
创建一个数据库和一个表
我们需要创建一个带有表的数据库,以便在其中执行我们的事务命令。下面是创建表的程序。
CREATE DATABASE Megacollege;
CREATE TABLE STUDENTS(Id integer PRIMARY KEY, Name text, Regno varchar, Course text, Fees integer);
INSERT INTO STUDENTS VALUES(1,'John', 'V20/680', 'Education', 40000);
INSERT INTO STUDENTS VALUES(2,'Ahmed', 'G4/270', 'Computer Science',50000);
INSERT INTO STUDENTS VALUES(3,'Ian', 'A43/476', 'Engineering', 62500);
INSERT INTO STUDENTS VALUES(4,'Jane', 'A19/520', 'IT', 41200);
INSERT INTO STUDENTS VALUES(5,'Robert','P62/491', 'Nursing',43700);
INSERT INTO STUDENTS VALUES(6,'Hellen', 'V20/470', 'Education', 22000);
INSERT INTO STUDENTS VALUES(7,'Joan','P62/801', 'Nursing',18000);
BEGIN TRANSACTION;
COMMIT;
SELECT * FROM STUDENTS;
下面是该程序的输出。
| ID | 名称 | 注册号 | 课程 | 费用 |
|---|---|---|---|---|
| 1 | 约翰 | V20/630 | 教育学 | 40000 |
| 2 | 艾哈迈德 | G4/270 | 计算机科学 | 50000 |
| 3 | IAN | A43/476 | 工程学 | 62500 |
| 4 | JANE | A19/520 | 信息技术 | 41200 |
| 5 | ROBERT | P62/491 | 护理学 | 43700 |
| 6 | HELLEN | V20/470 | 教育学 | 22000 |
| 7 | JOAN | P62/801 | 护理学 | 18000 |
事务性控制指令
数据处理语言(DML)指令是利用事务性命令,如INSERT、UPDATE和DELETE。这些指令不能用数据定义语言,因为它们会自动提交到数据库中。下面是交易命令。
COMMIT- 保存对数据库所做的修改。ROLLBACK- 重做在提交到数据库之前所做的修改。SAVEPOINT- 保存事务中的一个点,以便进行回滚。SET TRANSACTION- 给事务起一个名字。
COMMIT命令
COMMIT命令保存作为事务的一部分对数据库所做的修改。COMMIT命令保留了自上一条COMMIT或ROLLBACK命令以来的所有数据库事务。COMMIT命令的语法。
BEGIN TRANSACTION;
COMMIT
我们可以从表中删除费用=40000的记录,并提交数据库中的更改。
BEGIN TRANSACTION;
DELETE FROM STUDENTS
WHERE FEES = 40000;
COMMIT;
这条命令将从表中删除费用等于40000的记录,并将修改内容保存到数据库中。当这个命令被执行时,结果如下。
| ID | 名称 | 注册号 | 课程 | 费用 |
|---|---|---|---|---|
| 2 | 艾哈迈德 | G4/270 | 计算机科学 | 50000 |
| 3 | IAN | A43/476 | 工程学 | 62500 |
| 4 | JANE | A19/520 | 信息技术 | 41200 |
| 5 | ROBERT | P62/491 | 护理学 | 43700 |
| 6 | HELLEN | V20/470 | 教育学 | 22000 |
| 7 | JOAN | P62/801 | 护理学 | 18000 |
第一行被删除,结果被保存。
ROLLBACK命令
ROLLBACK命令只能用于撤销从上一条ROLLBACK或COMMIT命令发出的交易。ROLLBACK命令的语法如下。
BEGIN TRANSACTION;
ROLLBACK;
考虑从费用=40000的表中删除一条记录,然后ROLLBACK更改。
BEGIN TRANSACTION;
DELETE FROM STUDENTS
WHERE FEES = 40000;
ROLLBACK;
执行回滚命令的结果如下。
| ID | 名称 | REG NO | 课程 | 费用 |
|---|---|---|---|---|
| 1 | 约翰 | V20/630 | 教育学 | 40000 |
| 2 | 艾哈迈德 | G4/270 | 计算机科学 | 50000 |
| 3 | IAN | A43/476 | 工程学 | 62500 |
| 4 | JANE | A19/520 | 信息技术 | 41200 |
| 5 | ROBERT | P62/491 | 护理学 | 43700 |
| 6 | HELLEN | V20/470 | 教育学 | 22000 |
| 7 | JOAN | P62/801 | 护理学 | 18000 |
删除操作不会改变数据库的记录,因此结果是一样的,数据库保持不变。
SAVEPOINT命令
这条命令将一个事务回滚到数据库中的某一点,而不需要回滚整个事务。SAVEPOINT命令的语法。
BEGIN TRANSACTION;
SAVEPOINT SAVEPOINT_NAME;
与ROLLBACK命令不同的是,SAVEPOINT命令只是在所有事务语句中创建一个SAVEPOINT。回滚到一个SAVEPOINT。
BEGIN TRANSACTION;
ROLLBACK TO SAVEPOINT_NAME;
我们可以从STUDENTS表中删除三条记录。我们在每次删除前都创建一个SAVEPOINT,这使得我们可以随时ROLLBACK到任何一个SAVEPOINT,以回到记录的原始状态。
BEGIN TRANSACTION;
SAVEPOINT SP1;
DELETE FROM STUDENTS WHERE ID = 1;
SAVEPOINT SP2;
DELETE FROM STUDENTS WHERE ID= 2;
SAVEPOINT SP3;
DELETE FROM STUDENTS WHERE ID= 3;
执行savepoint命令后,我们得到的结果是。
| ID | 名称 | REG NO | 课程 | 费用 |
|---|---|---|---|---|
| 4 | 简 | A19/520 | 信息技术 | 41200 |
| 5 | ROBERT | P62/491 | 护理学 | 43700 |
| 6 | HELLEN | V20/470 | 教育学 | 22000 |
| 7 | JOAN | P62/801 | 护理学 | 18000 |
我们已经从表上删除了id 1,2和3,但分别有保存点SP1,SP2和SP3。现在我们可以使用这些保存点回滚到任何一点。
ROLLBACK TO SP2;
| ID | 名称 | 注册号 | 课程 | 费用 |
|---|---|---|---|---|
| 2 | 艾哈迈德 | G4/270 | 计算机科学 | 50000 |
| 3 | IAN | A43/476 | 工程学 | 62500 |
| 4 | JANE | A19/520 | 信息技术 | 41200 |
| 5 | ROBERT | P62/491 | 护理学 | 43700 |
| 6 | HELLEN | V20/470 | 教育学 | 22000 |
| 7 | JOAN | P62/801 | 护理学 | 18000 |
回滚命令适用于保存点SP2之后发生的操作,由于保存点SP1最初是在SP2之前执行的,所以不能回滚。
RELEASE SAVEPOINT命令
这条命令用于删除一个创建的SAVEPOINT。RELEASE SAVEPOINT命令的语法。
BEGIN TRANSACTION;
RELEASE SAVEPOINT savepoint_name;
ROLLBACK命令不能逆转交易,因为最后一条SAVEPOINT命令已经被释放。
SET TRANSACTION命令
这条命令用来启动一个数据库事务。它指定了事务的如下特征。它指定了一个事务是只读的还是读写的。SET TRANSACTION的语法。
BEGIN TRANSACTION;
SET TRANSACTION [READ WRITE | READ ONLY];
结论
有了这些,你就可以在数据库中执行事务,并与你的数据库一起工作。你也可以在意外删除的情况下获得对数据的访问。你可以用你自己的数据库尝试更多的例子,以便更好地理解。