事务是并发控制的基本单位。并发控制机制的任务主要是(1)对并发操作进行正确调度,(2)保证事务的隔离性,(3)保证数据库的一致性。
【例】并发操作带来数据的不一致性实例
[例11.1]飞机订票系统中的一个活动序列
①甲售票点(事务T1)读出某航班的机票余额A,设A=16;
②乙售票点(事务T2)读出同一航班的机票余额A,也为16;
③甲售票点卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库;
④乙售票点也卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库
结果:明明卖出两张机票,数据库中机票余额只减少1
这种情况称为数据库的不一致性,是由并发操作引起的。在并发操作情况下,对T1、T2两个事务的操作序列的调度是随机的。若按上面的调度序列执行,T1事务的修改就被丢失。原因为第4步中T2事务修改A并写回后覆盖了T1事务的修改。
并发操作带来的数据不一致性包括:
1.丢失修改(Lost Update):两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失。上面飞机订票例子就属此类。
2.不可重复读(Non-repeatableRead):事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。包括三种情况:
(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值;

(2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了;
(3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为幻影现象(PhantomRow)
3.读“脏”数据(DirtyRead)
事务T1修改某一数据,并将其写回磁盘;事务T2读取同一数据后,T1由于某种原因被撤销;这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致;T2读到的数据就为“脏”数据,即不正确的数据。

产生上述数据不一致性的原因在于并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。对数据库的应用有时允许某些不一致性,例如有些统计工作涉及数据量很大,读到一些“脏”数据对统计精度没什么影响,可以降低对一致性的要求以减少系统开销。
并发控制的主要技术:封锁(Locking);时间戳(Timestamp);乐观控制法;多版本并发控制(MVCC)。