首页 理论教育数据库技术与应用教程:并发控制概述

数据库技术与应用教程:并发控制概述

【摘要】:并发控制就是要用正确的方法来调度并发操作,使一个事务的执行不受其他事务的干扰,避免造成数据的不一致情况。

数据库中的数据是可以共享的资源,因此会有很多用户同时使用数据库中的数据,也就是说,在多用户系统中,可能同时运行着多个事务,而事务的运行需要时间,并且事务中的操作需要一定的数据。当系统中同时有多个事务运行时,特别是当这些事务使用同一段数据时,彼此之间就有可能产生相互干扰的情况。

事务是并发控制的基本单位,保证事务的ACⅠD特性是事务处理的重要任务,而事务的ACⅠD特性会因多个事务对数据的并发操作而遭到破坏。为保证事务之间的隔离性和一致性,数据库管理系统应该对并发操作进行正确的调度。

下面介绍并发事务之间可能相互干扰的情况。

假设有两个飞机订票点A和B,如果A、B两个订票点恰巧同时办理同一架航班的飞机订票业务。其操作过程及顺序如下:

①A订票点(事务A)读出航班目前的机票余额数,假设为16张。

②B订票点(事务B)读出航班目前的机票余额数,也为16张。

③A订票点订出6张机票,修改机票余额为16-6=10,并将10写回到数据库中。

④B订票点订出5张机票,修改机票余额为16-5=11,并将11写回到数据库中。

由此可见,这两个事务不能反映出飞机实际票数,而且B事务还覆盖了A事务对数据库的修改,使数据库中的数据不可信。这种情况就称为数据的不一致,这种不一致是由并发操作引起的。在并发操作情况下,会产生数据的不一致,是因为系统对A、B两个事务的操作序列的调度是随机的。这种情况在现实当中是不允许发生的,因此,数据库管理系统必须想办法避免出现这种情况,这就是数据库管理系统在并发控制中要解决的问题。

并发操作所带来的数据不一致情况大致可以概括为四种,即丢失修改、不可重复读、读“脏”数据和产生“幽灵”数据,下面分别介绍这四种情况。

1.丢失数据修改

丢失数据修改是指两个事务T1和T2读入同一数据并进行修改,T2提交的结果破坏了提交的结果,导致T1的修改被T2覆盖掉了。上述飞机订票系统就属于这种情况。丢失修改的情况如图7-5所示。

(www.chuimin.cn)

图7—5 丢失数据修改

2.读“脏”数据

读“脏”数据是指一个事务读了某个失败事务运行过程中的数据。即事务T1修改了某一数据,并将修改结果写回到磁盘,然后事务T2读取了同一数据(是T1修改后的结果),但后来由于某种原因撤销了它所做的操作,这样被T1修改过的数据又恢复为原来的值,那么T2读到的值就与数据库中实际的数据值不一致了。这种情况就称为T2读的数据为T1的“脏”数据,或不正确的数据。读“脏”数据的情况如图7-6所示。

图7—6 读“脏”数据

3.不可重复读

不可重复读是指事务T1读取数据后,事务T2执行了更新操作,修改了T1读取的数据,T1操作完数据后,又重新读取了同样的数据,但这次读数据后,当T1再对这些数据进行相同操作时,所得的结果与前一次不一样。不可重复读的情况如图7-7所示。

图7—7 不可重复读

4.产生“幽灵”数据

产生“幽灵”数据实际属于不可重复读的范畴。它是指当事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中的部分记录,或者在其中添加了部分记录,那么当T1再次按相同条件读取数据时,发现其中莫名其妙地少了(删除)或多了(插入)一些记录。这样的数据对T1来说就是“幽灵”数据或称“幻影”数据。

产生这四种数据不一致现象的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方法来调度并发操作,使一个事务的执行不受其他事务的干扰,避免造成数据的不一致情况。