学习数据库中的事务管理

141 阅读7分钟

数据库中的事务管理

事务是在数据库上执行的工作的逻辑单位。它们是由终端用户或应用程序完成的逻辑上有序的工作单位。

一个事务是由一个或多个数据库的修改组成的。例如,从一个表中创建、更新或删除一条记录。为了保持数据的完整性和解决数据库问题,跟踪这些事务是至关重要的。我们可以将SQL查询捆绑在一起,作为一个单一的事务运行

前提条件

要继续学习本教程,你需要知道基本的SQL(结构化查询语言),并了解如何创建一个数据库。

事务状态

有各种数据库事务状态,如下所示。

  1. 活动状态- 这是事务执行过程开始的状态。在数据库上进行读或写等操作。
  2. 部分提交--意味着一个事务一旦完成,就只能部分提交。
  3. 提交阶段--在事务执行成功后,事务就处于提交状态。对数据库所做的所有改变都被永久记录下来。
  4. 失败状态- 如果一个事务在活动状态下被中止,或者其中一个检查失败,那么该事务就处于失败状态。
  5. 终止状态- 一旦事务离开系统不能再次重启,就会发生这种状态。

事务属性

事务有四个主要属性,用缩写ACID表示。这指的是Atomicity,Consistency,Isolation, 和Durability

  1. 原子性--事务不能被细分,只能作为一个整体来执行,并被视为一个原子单元。要么所有的操作都被执行,要么不执行。
  2. 一致性- 在数据库中执行任何事务后,它应该保持一致。任何事务都不应该对驻留在数据库中的数据产生不利影响。
  3. 隔离性- 当几个事务需要同时在数据库中进行时,每个事务都被当作是一个单一的事务。因此,单个事务的完成不应该对其他事务的完成产生影响。
  4. 持久性- 从持久性来看,所有的改变必须是永久性的,一旦事务被提交,事务的效果就不能被逆转。在系统故障或意外关机的情况下,一个完整的事务所做的改变没有写入磁盘,在重新启动时,这些改变应该被记住并恢复。

创建一个数据库和一个表

我们需要创建一个带有表的数据库,以便在其中执行我们的事务命令。下面是创建表的程序。

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
3IANA43/476工程学62500
4JANEA19/520信息技术41200
5ROBERTP62/491护理学43700
6HELLENV20/470教育学22000
7JOANP62/801护理学18000

事务性控制指令

数据处理语言(DML)指令是利用事务性命令,如INSERT、UPDATE和DELETE。这些指令不能用数据定义语言,因为它们会自动提交到数据库中。下面是交易命令。

  1. COMMIT - 保存对数据库所做的修改。
  2. ROLLBACK - 重做在提交到数据库之前所做的修改。
  3. SAVEPOINT - 保存事务中的一个点,以便进行回滚。
  4. 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
3IANA43/476工程学62500
4JANEA19/520信息技术41200
5ROBERTP62/491护理学43700
6HELLENV20/470教育学22000
7JOANP62/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
3IANA43/476工程学62500
4JANEA19/520信息技术41200
5ROBERTP62/491护理学43700
6HELLENV20/470教育学22000
7JOANP62/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课程费用
4A19/520信息技术41200
5ROBERTP62/491护理学43700
6HELLENV20/470教育学22000
7JOANP62/801护理学18000

我们已经从表上删除了id 1,2和3,但分别有保存点SP1,SP2和SP3。现在我们可以使用这些保存点回滚到任何一点。

ROLLBACK TO SP2;
ID名称注册号课程费用
2艾哈迈德G4/270计算机科学50000
3IANA43/476工程学62500
4JANEA19/520信息技术41200
5ROBERTP62/491护理学43700
6HELLENV20/470教育学22000
7JOANP62/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];

结论

有了这些,你就可以在数据库中执行事务,并与你的数据库一起工作。你也可以在意外删除的情况下获得对数据的访问。你可以用你自己的数据库尝试更多的例子,以便更好地理解。