数据库并发控制:乐观并发控制与时间戳排序详解
1. 乐观并发控制概述
传统的锁机制在并发控制中存在诸多弊端,Kung和Robinson于1981年提出了乐观并发控制方法来避免这些问题。锁机制的缺点主要包括:
- 锁维护开销 :对于不支持并发访问共享数据的系统,锁维护是额外的开销。即使是只读事务,为保证读取数据不被同时修改,通常也需要使用锁,但实际上锁可能仅在最坏情况下才必要。例如,两个客户端进程同时对n个对象的值进行递增操作,若它们同时启动且运行时间相近,以不相关的顺序访问对象,平均每n次事务中只有1次需要锁。
- 死锁问题 :使用锁可能导致死锁。死锁预防会严重降低并发度,因此需要通过超时或死锁检测来解决死锁情况,但这两种方法在交互式程序中都不尽如人意。
- 并发度受限 :为避免级联中止,锁必须在事务结束时才能释放,这可能显著降低并发潜力。
乐观并发控制基于多数应用中两个客户端事务访问同一对象的可能性较低这一观察。事务可以在没有与其他事务冲突的假设下继续执行,直到客户端完成任务并发出 closeTransaction
请求。当发生冲突时,通常会中止某个事务,客户端需要重新启动该事务。
2. 乐观并发控制的事务阶段
乐观并发控制的事务分为三个阶段:
- 工作阶段 :每个事务对其更新的对象都有一个临时版本,这是该对象最近提交版本的副本。使用临时版本允许事务在工作阶段或因与其他事务冲突而验证失败时中止,且不会影响对象。读操作立即执行,如果该事务