并发控制处理多个事务的交错执行。在下一篇文章中,我们将看到什么是可串行化,以及如何确定调度是否可串行化。
什么是交易?
一组逻辑相关的操作称为事务。交易的主要操作是:
Read(A):读取操作 Read(A) 或 R(A) 从数据库中读取 A 的值并将其存储在主内存的缓冲区中。
Write (A):写操作 Write(A) 或 W(A) 将值从缓冲区写回数据库。
(注意:它并不总是需要将它写回数据库,它只是将更改写入缓冲区,这就是脏读出现的原因)
让我们从一个包含以下操作的帐户中进行借方交易:
- R(A);
- A=A-1000;
- 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 的交易:
- 读(x);
- x := x – 50;
- 写(x);
- 准备好);
- y := y + 50;
- 写(y);
账户 x 和 y 的总和应该保持不变的约束是?
- 原子性
- 一致性
- 隔离
- 耐用性
[2015年门]
解决方案:正如在交易属性中讨论的,一致性属性表示账户 x 和 y 的总和在交易开始之前和完成之后应该保持不变。所以,正确答案是B。
下一篇文章 – 计划的可序列化