SQL Server 2000+ADO.NET 实现并发控制...(一)
1 并发一致性问题
常见并发并发一致性问题包括:丢失的修改、不可重复读、读脏数据、幻
影读(幻影读在一些资料中往往与不可重复读归为一类)。
1.1 丢失修改
下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题。
考虑飞机订票系统中的一个活动序列:
1. 甲售票点(甲事务)读出某航班的机票余额 A,设 A=16.
2. 乙售票点(乙事务)读出同一航班的机票余额 A,也为 16.
3. 甲售票点卖出一张机票,修改余额 A←A-1.所以 A 为 15,把 A 写回数据库.
4. 乙售票点也卖出一张机票,修改余额 A←A-1.所以 A 为 15,把 A 写回数据库.
结果明明卖出两张机票,数据库中机票余额只减少 1。
归纳起来就是:两个事务 T1 和 T2 读入同一数据并修改,T2 提交的结果
破坏了 T1 提交的结果,导致 T1 的修改被丢失。前文(2.1.4 数据删除与更
新)中提到的问题及解决办法往往是针对此类并发问题的。但仍然有几类问题
通过上面的方法解决不了,那就是:
1.2 不可重复读
不可重复读是指事务 T1 读取数据后,事务 T2 执行更新操作,使 T1 无法
再现前一次读取结果。具体地讲,不可重复读包括三种情况:
事务 T1 读取某一数据后,事务 T2 对其做了修改,当事务 1 再次读该
数据时,得到与前一次不同的值。例如,T1 读取 B=100 进行运算,T2 读取
同一数据 B,对其进行修改后将 B=200 写回数据库。T1 为了对读取值校对重
读 B,B 已为 200,与第一次读取值不一致。
事务 T1 按一定条件从数据库中读取了某些数据记录后,事务 T2 删除
了其中部分记录,当 T1 再次按相同条件读取数据时,发现某些记录神密地消
失了。
事务 T1 按一定条件从数据库中读取某些数据记录后,事务 T2 插入了
一些记录,当 T1 再次按相同条件读取数据时,发现多了一些记录。(这也叫
做幻影读)
1.3 读"脏"数据
读"脏"数据是指事务 T1 修改某一数据,并将其写回磁盘,事务 T2 读取同
一数据后,T1 由于某种原因被撤消,这时 T1 已修改过的数据恢复原值,T2 读
到的数据就与数据库中的数据不一致,则 T2 读到的数据就为"脏"数据,即不正
确的数据。
产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它
事务的干扰,从而避免造成数据的不一致性。
2 并发一致性问题的解决办法
2.2.2.1 封锁(Locking)
封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务 T 在对某
个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后