📜  DBMS 中的并发控制

📅  最后修改于: 2021-09-08 15:50:37             🧑  作者: Mango

并发控制处理多个事务的交错执行。在下一篇文章中,我们将看到什么是可串行化,以及如何确定调度是否可串行化。

什么是交易?

一组逻辑相关的操作称为事务。交易的主要操作是:

Read(A):读取操作 Read(A) 或 R(A) 从数据库中读取 A 的值并将其存储在主内存的缓冲区中。

Write (A):写操作 Write(A) 或 W(A) 将值从缓冲区写回数据库。

(注意:它并不总是需要将它写回数据库,它只是将更改写入缓冲区,这就是脏读出现的原因)

让我们从一个包含以下操作的帐户中进行借方交易:

  1. R(A);
  2. A=A-1000;
  3. W(A);

假设交易开始前 A 的值为 5000。

  • 第一个操作从数据库中读取 A 的值并将其存储在缓冲区中。
  • 第二个操作将其值减少 1000。因此缓冲区将包含 4000。
  • 第三个操作将值从缓冲区写入数据库。所以 A 的最终值将是 4000。

但也有可能事务在执行其某些操作后可能会失败。失败的原因可能是硬件、软件或电源等。例如,如果上述借方交易在执行操作 2 后失败,则数据库中的 A 值将保持为 5000,这是银行不接受的。为了避免这种情况,Database 有两个重要的操作:

提交:事务的所有指令都成功执行后,事务所做的更改在数据库中永久存在。

回滚:如果事务不能成功执行所有操作,则事务所做的所有更改都将被撤消。

交易的属性

原子性:由于事务是一组逻辑相关的操作,因此要么全部执行,要么不执行。上面讨论的借方交易应该执行所有三个操作或不执行所有操作。如果借方交易在执行操作 1 和 2 后失败,则其新值 4000 将不会在数据库中更新,从而导致不一致。

一致性:如果同一账户的借方和贷方交易操作并发执行,可能会使数据库处于不一致状态。

  • 例如,T1(从 A 借记 1000 卢比)和 T2(从 A 借记 500 卢比)同时执行,数据库达到不一致状态。
  • 让我们假设 A 的账户余额为 Rs。 5000. T1 读取 A(5000) 并将该值存储在其本地缓冲区空间中。然后 T2 读取 A(5000) 并将该值存储在其本地缓冲区空间中。
  • T1执行A=A-1000(5000-1000=4000),4000存放在T1缓冲区空间。然后T2执行A=A+500(5000+500=5500),5500存入T2缓冲区空间。 T1 将其缓冲区中的值写回数据库。
  • A 的值在数据库中更新为 4000,然后 T2 将值从其缓冲区写回数据库。 A 的值更新为 5500,表明借方交易的效果丢失,数据库变得不一致。
  • 为了保持数据库的一致性,我们需要并发控制协议,这将在下一篇文章中讨论。 T1 和 T2 及其缓冲区和数据库的操作如表 1 所示。
T1 T1’s buffer space T2 T2’s Buffer Space Database
        A=5000
R(A); A=5000     A=5000
  A=5000 R(A); A=5000 A=5000
A=A-1000; A=4000   A=5000 A=5000
  A=4000 A=A+500; A=5500  
W(A);     A=5500 A=4000
    W(A);   A=5500

表格1

隔离:在事务提交之前,事务的结果不应对其他人可见。例如,让我们假设 A 的余额为 Rs。 5000 和 T1 借记卢比。来自 A 的 1000。A 的新余额将是 4000。如果 T2 贷记 Rs。 500 到 A 的新余额,A 将变为 4500,此后 T1 失败。然后我们也必须回滚 T2,因为它使用的是 T1 产生的值。因此,事务结果在提交之前不会对其他事务可见。

持久:一旦数据库提交了一个事务,该事务所做的更改应该是永久性的。例如;如果一个人将 500000 美元记入他的帐户,银行不能说更新已经丢失。为了避免这个问题,数据库的多个副本存储在不同的位置。

什么是日程表?

调度是来自一个或多个事务的一系列操作。时间表可以有两种类型:

  • 串行调度:当一个事务在开始另一事务之前完全执行时,该调度称为串行调度。串行调度始终是一致的。例如;如果调度 S 有借方事务 T1 和贷方事务 T2,则可能的串行调度是 T1 后跟 T2 (T1->T2) 或 T2 后跟 T1 ((T2->T1)。串行调度吞吐量低且资源利用率低.
  • 并发调度:当一个事务的操作与调度的其他事务的操作交错时,该调度称为并发调度。例如;表 1 所示的借记和贷记交易时间表是并行的。但是并发会导致数据库不一致。上面的并发调度示例也不一致。

问题:考虑以下涉及两个银行账户 x 和 y 的交易:

  1. 读(x);
  2. x := x – 50;
  3. 写(x);
  4. 准备好);
  5. y := y + 50;
  6. 写(y);

账户 x 和 y 的总和应该保持不变的约束是?

  1. 原子性
  2. 一致性
  3. 隔离
  4. 耐用性

[2015年门]

解决方案:正如在交易属性中讨论的,一致性属性表示账户 x 和 y 的总和在交易开始之前和完成之后应该保持不变。所以,正确答案是B。

下一篇文章 – 计划的可序列化