Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435484
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: DB2/Informix

2008-06-17 23:18:32

多版本两阶段封锁机制

多版本两阶段封锁机制,将多版本并发控制的优点与两阶段封锁协议的优点结合起来。该机制对只读事务与更新事务加以区分。更新事务执行强两阶段封锁协议,即它们持有全部锁直到事务结束。因此,它们可以按照提交的次序进行串行化。

数据项的每一个版本有一个时间戳,这种时间戳不是真正基于时钟的时间戳,而是一个计数器,我们称之为ts_counter,这个计数器在事务提交时增加计数。

在只读事务开始执行前,系统读取ts_counter的当前值来作为该事务的时间戳,并依照ts_counter读取数据版本。该版本是数据当前的最新版本,事务在整个处理过程中都只参照数据的这个版本。

当更新事务读取一个数据项时,它在获得该数据项上的共享锁后,读取该数据项最新版本的值。当更新事务想写一个数据项时,它首先要获得该数据项上的排它锁,然后为此数据项创建一个新的版本,写操作在新版本上进行。新版本的时间戳最初值为∞,它大于任何可能的时间戳。当更新事务完成其任务后,事务将它新创建版本的时间戳设为ts_counter + 1,完成事务提交并释放锁。

这样,在ts_counter增加之后启动的只读事务,将看到被更新事务更新后的ts_counter值;而那些在增加之前就启动的只读事务,将看到被更新事务更新之前的ts_counter值。无论哪种情况,只读事务均不必等待加锁,它们访问、并只允许访问所看到ts_counter值对应的数据版本。

在多版本两阶段封锁机制中,对数据版本的删除类似于多版本时间戳机制中采用的方式。假设有某数据项的两个版本,两个版本的时间戳都小于系统中最老只读事务的时间戳,那么两个版本中较旧的版本将不会再被使用,因而可以删除。

由于两阶段封锁协议不能解决死锁问题,因此使用多版本两阶段封锁机制的数据库系统,在运行过程中仍旧会出现死锁。但由于查询处理不需要任何锁,因此系统中出现死锁的概率会大大降低。对该问题的处理和解决,可以参看第6.3.9一节。

阅读(2158) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~