数据库是一个共享资源,可以供多个用户使用。允许多个用户同时使用同一个数据库的数据库系统称为多用户数据库系统。例如飞机订票数据库系统、银行数据库系统等都是多用户数据库系统。在这样的系统中,在同一时刻并发运行的事务数可达数百上千个。
事务可以一个一个地串行执行,即每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。事务在执行过程中需要不同的资源,有时需要CPU,有时需要存取数据库,有时需要I/O,有时需要通信。如果事务串行执行,则许多系统资源将处于空闲状态。因此,为了充分利用系统资源,发挥数据库事务共享资源的特点,应该允许多个事务并行地执行。
在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行(分时系统)。这种并行执行方式称为交叉并发方式。虽然单处理机系统中的并行事务并没有真正地并行运行,但是减少了处理机的空闲时间,提高了系统的效率。
在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正地并发运行。这种并发执行方式称为同时并发方式。
当多个用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性。所以数据库管理系统必须提供并发控制机制。并发控制机制是很亮一个数据库管理系统性能的重要标志之一。
事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要任务,而事务的ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。
如下示例:考虑飞机订票系统中的一个活动序列:
a.甲售票点(事务T1)读出某航班的机票余额A,设A=16。
b.乙售票点(事务T2)读出同一航班的机票余额A,也为16。
c.甲售票厅卖出一张机票,修改余额A=A-1,所以A为15,将A写回数据库。
d.乙售票厅也卖出一张机票,修改余额A=A-1,所以A也为15,把A写回数据库。
明明卖出两张票,但是数据库中机票余额只减少1张。这种情况称为数据库的不一致性。这种不一致性是由并发操作引起的,在并发操作情况下,对T1、T2两个事务的操作序列的调度是随机的。若按上面的调度序列执行,T1事务的修改就会丢失。这是由于T2事务修改A并写回后覆盖了T1事务的修改。
并发操作带来的数据不一致性包括丢失修改、不可重复读和读“脏”数据。
丢失修改:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,结果导致T1的修改被丢失了。
不可重复读:事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。不可重复读包括以下三种情况,第一T1读取某一数据后,T2对其进行了修改,T1再次按相同条件读取该数据时,和第一次读到的结果不一致;第二T1读取了数据后,T2删除了T1读取的某些数据,当T1再次按相同条件读取数据时,发现某些数据没有了。第三T1按一定条件从数据库中去读某些数据后,T2在数据库中插入了一些新数据,T1再按相同条件读取数据时,发现多了一些数据。其中第二种和第三种也叫做幻读。
读“脏”数据:T1修改某一数据并将其写回数据库,T2读取同一数据后,T1由于某种原因被撤销,这时被T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,T2读到的数据就位“脏”数据。
并发控制的主要技术有封锁、时间戳、乐观控制法和多版本并发控制等。