《电子技术应用》
您所在的位置:首页 > 其他 > 设计应用 > 数据仓库的动态粒度锁管理机制
数据仓库的动态粒度锁管理机制
刘 晖 徐兰芳
武汉华中科技大学计算机学院信息安全实验室(430074)
摘要: 通过分析数据仓库体系结构中并发控制导致的数据的不一致性,提出了解决并发控制的动态加锁粒度的两段锁协议。
Abstract:
Key words :

摘   要: 通过分析数据仓库体系结构中并发控制导致的数据的不一致性,提出了解决并发控制的动态加锁粒度的两段锁协议。
关键词: 数据仓库  视图  加锁粒度  并发控制

1  数据仓库系统的体系结构
  数据仓库是面向主题的、集成的、随时间而变的、持久的数据集合,用于支持管理决策过程。
数据仓库系统的体系结构如图1所示。

  (1)信息源。可以是传统数据库,也可以是文件、HTML文件和知识库等。
  (2)包装器。包装工作包括对数据结构和数据类型进行统一的转换,必要时还需对数据之间的语义联系进行重新构造。
  (3)监控器。监控器用来建立数据的各种概要文件,负责监控数据库中所有表的目录、表的内容以及数据仓库与信息源之间的数据增量,并报告给上层的集成器。
  (4)集成器。集成器不仅负责数据仓库初始化,还负责接收监控器的变化报告,并将信息源的新变化根据有关定义转化到数据仓库中。
  (5)实现图管理部件。负责数据共享、安全保密、归档、备份、恢复及元数据的管理工作。
  (6)查询与分析工具。完成决策问题所需的各种查询与分析工具,包括用户查询工具、C/S工具、用于多维数据的OLAP分析工具、数据挖掘(DM)工具等,以实现决策支持系统的各种要求。
  在数据仓库体系结构中,信息源采集数据,监控器管理信息源数据的增量,包装器对需要加载的数据进行统一的转换后触发事件,从而引起集成器来加载和集成数据,然后存放于数据仓库中。各种查询与分析工具通过实现图管理部件来访问数据仓库。
2  多重粒度的数据一致性
  在数据仓库中,数据量是巨大的。有时数据的内容经常发生变化,而且不要求特别详细的历史记录,这时通过使用简要记录来构成综合级数据粒度。简要记录是把操作型数据中的许多不同的、详细的记录组合在一起形成一条记录。一条简要记录以聚集的形成代表了许多条操作型记录。建立简要记录就是为最终用户的访问和分析提供一种紧凑的、方便的数据组织形式。另外,数据仓库在其内部都以一种称为快照的数据结构为中心来组织。快照是因为一件事件的发生而引起的。例如,操作型环境中的一些活动需要记录下来或者用时间来引发,则实际发生的活动与被置入数据仓库中的快照数目是一一对应的,这样数据仓库就能追踪所有的历史活动。快照代表了一个单一的事件,构成了数据仓库的细节级粒度。
  快照和简要记录构成了数据仓库中的视图。视图的数据存储在数据仓库中,称数据仓库视图为实例化视图。实例化视图一般没有自动更新的功能,但事实上,当信息源数据发生变化后,经过集成器的处理会引起数据仓库的相应变化。这时带来了一些问题:首先,某个信息源产生了数据仓库的几个视图,而这几个视图之间相互关联;其次,信息源的分布性使得视图的更新可能并发出现,这时必须有合适的并发控制策略保证视图数据与信息源数据之间的一致性。
  下面介绍通过一种锁管理机制的并发控制策略来保证视图数据与信息源数据之间一致性的方法。
3  数据仓库的锁管理机制
  为保证数据一致性所使用的并发控制算法中最著名的是两段锁协议(2PL协议)。其主要内容是并发执行的多个事务对数据进行操作以前要进行加锁,且每个事务中的所有加锁操作在第一个解锁操作以前执行。由于数据仓库与传统数据库存在很大的差异,故2PL协议必须加以改进,以适应数据仓库体系结构。
3.1 锁模式
  在数据仓库中对资源对象加锁时,通过对锁的区分来实现可串行化调度。锁可分为:
  (1)共享锁:即Shared(S)。共享锁用于只读操作,它允许多个并发事务读取所锁定的资源,但禁止其他事务对锁定资源的修改操作。
  (2)排它锁:即Exclusive(X)。用于数据修改操作,排它锁所锁定的资源不能被其他并发事务读取或修改。
  以上二种锁模式在试图锁定资源时存在兼容性问题,即在使用一种锁模式锁定资源期间是否允许其他事务再锁定该资源。例如,共享锁与共享锁兼容,就是指一个事务用共享锁锁定某一资源后,允许其他事务再在该资源上放置共享锁,使它们能够并发读取该资源;而排它锁与任何的锁都不兼容,是指一个事务用排它锁锁定某一资源期间,不允许另外一个事务在该资源上加锁。
3.2 动态加锁粒度的两段锁协议
  数据仓库中的信息源是分布式的,对各个信息源需划分为不同的子事务来执行,同时对数据仓库中的数据及信息源的数据加锁。故数据仓库要遵循2PL协议,其各个信息源也要遵循2PL协议。
  2PL协议可以简单归纳如下:对于若干个事务T1,T2,……Tn在m个信息源上执行,其集成器中的全局调度E可以由一组局部调度序列S1,S2,……,Sn来描述,每一个局部调度均遵守2PL协议,且对于有冲突操作事务Ti、Tj的冲突操作Oi、Oj,有Ti<Tj,则Oi<Oj。则全局调度E满足2PL协议,即是可串行化的。
  在2PL协议中,其加锁机制由最基本的读锁和写锁构成,其相容性前面已给出。由此可知,只要出现写操作就会出现冲突操作。但在很多情况下,对于读写冲突、写写冲突等,只要降低其加锁粒度,就可以化解该冲突操作。
  假设数据库DB={Tab1,Tab2,Tab3,Tab4}。Tab1与Tab2是相关联的表,Tab3与Tab4也是相关联的表,但二者之间是相对独立的,即它们之间没有共同的属性。据此,数据库DB可分为{Tab1,Tab2},{Tab3,Tab4}。有二个事务T1和T2,它们都将对DB进行写操作,其操作时序如图2所示。

  当在2PL协议中的加锁粒度为数据库DB时,则T2在t2时刻的写操作就要等到t3时刻以后了。因为T1必须等到t3时刻完成对Tab2的操作后才能释放对DB的锁。但如果把加锁层次降为DB中的表,则T1、T2就可在t1、t2时刻分别获得对Tab1、Tab3的锁,即T2就可在t2时刻完成写操作。这样显然并发度将有所提高,故在此引入动态加锁粒度的两段锁协议。
3.3 加锁粒度
  被加锁的数据对象的大小,即为加锁粒度。适当选定加锁粒度是非常重要的。加锁粒度越细,加锁次数将会增多,系统开销就会越大,但这样可减少冲突事务,使整个数据仓库的并发程度提高;加锁粒度越大,加锁的次数将会减小,系统开销随之减少,但并发度也会降低。所以加锁粒度的大小要根据实际情况决定。如果对信息源数据的集成进行大方面的加载,则采用较粗的加锁粒度;如果只是少量的读取,如只对某些记录和某些字段,则可采用较细的加锁粒度。下面用一种动态加锁粒度的机制来解决数据集成和加载时的并发控制。先介绍几个定义。
  (1)加锁粒度级别:数据的加锁层次。由于在数据仓库中有多种不同的数据对象(如信息源可以是数据库、知识库等),并且数据仓库中的数据也具有多重粒度,所以就有不同的加锁粒度级别。在数据库中可能的加锁粒度有:整个数据库、数据库的一个表空间(储存一个或多个表的一个逻辑存取空间)、表空间的一个表、一个表中的一条记录或一个表中的一个字段。在数据仓库中,数据是按主题来划分的,主题中包含视图。由此可见,不同环境中数据层次不同。因此不能把一个加锁粒度级别用在数据仓库中的所有地方,各个信息源以及数据仓库应有自己的加锁粒度级别。并且加锁粒度级别是一个偏序关系,即数据层次是有大小的。
  (2)加锁粒度集:加锁数据对象在某一加锁粒度级别的集合。
  (3)最小加锁粒度集:加锁数据对象在某一加锁粒度级别中最小级别的集合。
  (4)事务等待队列:用于放置相冲突的事务。
  假定Ti和Tj是一对加锁冲突事务,Ti是对数据对象DB的加锁请求者,而Tj是该数据对象的锁持有者。Min-Gran(Ti)、Min-Gran(Tj)分别为Ti、Tj对数据对象DB的最小加锁粒度集。Lock-Gran(Ti)、Lock-Gran(Tj)分别为Ti、Tj加锁粒度级别。Gran(Ti)、Gran(Tj)分别为Ti、Tj对数据对象DB的加锁粒度集。
动态加锁粒度运行机制的基本思想是:首先对将要运行的事务Ti、Tj确定合适的加锁粒度,然后计算冲突事务的Min-Gran(Ti)∩Min-Gran(Tj),如果不为?覫,则说明它们不能通过降低加锁粒度避免冲突,从而将后运行的事务置入事务等待队列;如果为?覫,则降低冲突事务的加锁粒度级别,直到事务可并发执行为止。当互相冲突的事务运行完成后,再把还在运行的事务的加锁粒度调整到最初运行时的加锁粒度。
动态加锁粒度的两段锁算法如下:
Lock Action(Ti,Tj)
BEGIN
  IF Conflicit(Ti,Tj) THEN  //*检查二事务是否冲突
    Store Gran(Ti), Gran(Tj)  //*保存事务的
               //原始加锁粒度集
       IF Min-Gran(Ti)∩Min-Gran(Tj)=Φ THEN
           DO Decrease Lock-Gran(Ti),Lock-Gran(Tj)
           UNTIL Gran(Ti)∩Gran(Tj)=Φ
              //*降低加锁粒度使二事务并发执行
          Ti Lock Gran(Ti)
          Tj Lock Gran(Tj)
       ELSE
           Queue-Insert(Tj)//*Tj置入事务等待队列
           Block Tj until Ti release the lock
      ENDIF
      ELSE
           Ti Lock Gran(Ti)
           Tj Lock Gran(Tj)
  ENDIF
  IF Complete(Ti) THEN  //*Ti事务执行完毕,
             //恢复Tj事务的原始加锁粒度集
        Restore Gran(Ti)
     ENDIF
     IF Complete(Tj) THEN  //*Tj事务执行完毕,
                 //恢复Ti事务的原始加锁粒度集
        Restore Gran(Tj)
        ENDIF        //*其中一事务执行完毕,
               //恢复另一事务的原始加锁粒度集
  END
  以上算法说明,对于一组事务T1,T2,……,Tn,其中每一个事务Ti(1≤i≤n)要先确定它的初始的加锁粒度级别。通过对Ti、Tj(i≠j,1≤i≤n,1≤j≤n)的冲突检测机制,确定它们是否能在已给定的加锁粒度级别运行。如果Ti、Tj冲突,再分别计算Min-Gran(Ti)、Min-Gran(Tj),判定在最小加锁粒度级别上是否冲突;如果不冲突就说明可以把Ti、Tj的加锁粒度同时降低到最小加锁粒度级别后并发执行,这样就增加了事务运行的并发度。由于该算法遵守2PL协议,从而保证了这一组事务的运行是可串行化的,也就保证了数据的一致性。
  上述算法使用了事务等待队列机制,故在死锁方面可以通过检测队列中等待事务的时间来确定。
4  结束语
  在数据仓库体系中,操作型数据环境(数据库)以及各种信息源也占有重要地位。在从信息源向数据仓库加载数据时,还要考虑到信息源自身的特点,如数据库对用户请求的实时相应。关于通过动态改变加锁粒度来增加并发度的问题,本文只涉及了一小部分,还有很多工作需要做,如选择合适的加锁粒度、信息源加锁粒度级别的确定、事务等待队列的机制等。
参考文献
1   王劲波,薛永生,徐勋民.一种基于加锁粒度的分布式高优先级两段锁的并发控制模型.计算机应用与软件,2003;6(16)
2   Inmon W H.数据仓库.北京:机械工业出版社,2003

3  王珊,罗立.从数据库到数据仓库.计算机世界,1996;15(7)
4   萨师煊,王珊.数据库系统概论.北京:高等教育出版社,2000
 

此内容为AET网站原创,未经授权禁止转载。