Concurrency-control mechanisms并发控制机制的必要性
事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要任务,而事务的 ACID 特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确。并发操作带来的数据不一致性包括丢失修改、不可重复读和读“脏”数据。
1. 丢失修改(lost update)
两个事务T1和T2,读入同一数据并修改,T2,提交的结果破坏了T1提交的结果,导致T的修改被丢失。
2. 不可重复读(non-repeatable read)
不可重复读是指事务T读取数据后,事务T执行更新操作,使T无法再现前一次读取结果。
具体地讲,不可重复读包括三种情况:
- 事务T1读取某一数据后,事务T2对其进行了修改,当事务T1再次读该数据时,得到与前一次不同的值。
- 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了。
- 事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
3. 读“脏”数据(dirty read)
读“脏”数据是指事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时被T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T:读到的数据就为“脏”数据,即不正确的数据。
产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制机制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
另一方面,对数据库的应用有时允许某些不一致性,例如有些统计工作涉及数据量很大,读到一些“脏”数据对统计精度没什么影响,这时可以降低对一致性的要求以减少系统开销。
并发控制的主要技术有封锁(locking)、时间戳(timestamp)、乐观控制法(optimistic
scheduler)和多版本并发控制(multi-version concurrency control,MVCC)等。