DBMS - 事务

一个事务可以定义为一组任务。 单个任务是不能进一步划分的最小处理单元。

让我们举一个简单交易的例子。 假设一名银行员工将 500 卢比从 A 的账户转到 B 的账户。 这个非常简单的小事务涉及几个低级任务。

A 的帐户

Open_Account(A)
Old_Balance = A.balance
New_Balance = Old_Balance - 500
A.balance = New_Balance
Close_Account(A)

B 的帐户

Open_Account(B)
Old_Balance = B.balance
New_Balance = Old_Balance + 500
B.balance = New_Balance
Close_Account(B)

ACID 属性

事务是程序的一个非常小的单元,它可能包含几个低级任务。 数据库系统中的事务必须保持 A 原子性、C 一致性、I 独立性和 D 持久性 − 俗称 ACID 属性 − 以确保准确性、完整性和数据完整性。

  • 原子性 − 该属性表明事务必须被视为一个原子单元,也就是说,要么执行所有操作,要么不执行任何操作。 数据库中不得存在事务部分完成的状态。 状态应该在事务执行之前或事务执行/中止/失败之后定义。

  • 一致性 − 在任何事务之后,数据库必须保持一致状态。 任何事务都不应对数据库中的数据产生任何不利影响。 如果数据库在事务执行之前处于一致状态,那么在事务执行之后也必须保持一致。

  • 独立性 − 在同时并行执行多个事务的数据库系统中,隔离属性表明所有事务都将被执行和执行,就好像它是系统中的唯一事务一样。 任何交易都不会影响任何其他交易的存在。

  • 持久性 − 即使系统发生故障或重新启动,数据库也应该足够持久以保存其所有最新更新。 如果事务更新数据库中的数据块并提交,那么数据库将保存修改后的数据。 如果事务提交,但系统在数据写入磁盘之前发生故障,那么一旦系统恢复运行,该数据将被更新。


可序列化

当操作系统在多道程序环境中执行多个事务时,一个事务的指令可能会与另一个事务交错。

  • 调度 − 事务的按时间顺序执行的顺序称为调度。 一个日程表中可以包含许多事务,每个事务都包含许多指令/任务。

  • 序列计划 − 它是一种调度,其中事务以首先执行一个事务的方式对齐。 当第一个事务完成其周期时,将执行下一个事务。 交易是一个接一个地排序的。 这种类型的调度称为串行调度,因为事务是以串行方式执行的。

在多事务环境中,串行调度被视为基准。 一个事务中一条指令的执行顺序不能改变,但是两个事务可以让它们的指令以随机方式执行。 如果两个事务相互独立并且处理不同的数据段,则此执行不会造成任何损害; 但是如果这两个事务处理相同的数据,那么结果可能会有所不同。 这种不断变化的结果可能会使数据库处于不一致的状态。

为了解决这个问题,我们允许并行执行一个事务调度,如果它的事务要么是可序列化的,要么它们之间有某种等价关系。


等价表

等价表可以有以下几种类型 −

结果等价

如果两个调度在执行后产生相同的结果,则称它们是结果等价的。 它们可能对某些值产生相同的结果,而对另一组值产生不同的结果。 这就是为什么这种等效性通常被认为不重要的原因。

视图等价

如果两个调度中的事务以相似的方式执行相似的操作,则两个调度将是视图等价的。

例如 −

  • 如果 T 读取 S1 中的初始数据,那么它也会读取 S2 中的初始数据。

  • 如果T读取了J在S1中写入的值,那么它也读取了J在S2中写入的值。

  • 如果 T 对 S1 中的数据值执行最终写入,那么它也会对 S2 中的数据值执行最终写入。

冲突等价

如果两个调度具有以下属性,则它们将发生冲突 −

  • 两者属于不同的事务。
  • 两者都访问相同的数据项。
  • 其中至少有一个是"写"操作。

当且仅当具有多个事务且操作冲突的两个调度被认为是冲突等价的 −

  • 两个调度都包含相同的事务集。
  • 两个调度中都维护了冲突操作对的顺序。

注意 − 视图等效计划是视图可序列化的,冲突等效计划是冲突可序列化的。 所有冲突可序列化的计划也是视图可序列化的。


事务状态

数据库中的事务可以处于以下状态之一 −

事务状态
  • Active − 在这种状态下,事务正在执行。 这是每个事务的初始状态。

  • Partially Committed − 当一个事务执行其最终操作时,它被称为处于部分提交状态。

  • Failed − 如果数据库恢复系统进行的任何检查失败,则称事务处于失败状态。 失败的事务不能再继续进行。

  • Aborted − 如果任何检查失败并且事务已达到失败状态,则恢复管理器回滚其对数据库的所有写操作,以使数据库恢复到执行事务之前的原始状态。 处于这种状态的事务称为中止。 事务中止后,数据库恢复模块可以选择两种操作之一 −

    • 重启事务
    • 终止事务
  • Committed − 如果一个事务成功地执行了它的所有操作,则称它已提交。 它的所有影响现在都永久建立在数据库系统上。