LotusDomino/Notes视野下的并发访问控制

(整期优先)网络出版时间:2009-02-12
/ 2

LotusDomino/Notes视野下的并发访问控制

代骁虎

关键词:并发访问;访问控制;排它锁;保存冲突

1引言

一个业务活动在工作流应用系统中由许多环节组成,每一环节都有人参与。对于基于Notes的工作流应用系统来说,随流程流动的一般是文档。文档中包含各种信息,若与具体业务相关的简单信息,则可放在表单域(字段)中;而复杂、不容拆分的信息则可作为文档的附件存在。流程各环节的活动拥有者能够对文档进行编辑,同时留下审批痕迹。

只有一个活动拥有者的环节,用户编辑并保存文档时不会发生保存冲突,而对有多个活动拥有者的环节来说,则很可能发生文档保存冲突。

图1所示是一个典型的办公流程,流程有四个环节,如果每一环节只有一个活动拥有者,那么随流程一起流动的文档在用户编辑保存时候不会出现保存冲突;然而,在审查环节有多个权力相同的用户可以对文档进行编辑,例如用户A正在编辑文档的时候用户B也打开文档进行编辑,那么A和B各自保存文档的时候就会出现保存冲突。

信息不能总集中存放在某一地点或某一台主机上。为了系统管理方便,人们通常理想化地把所有信息集中存放在一个地方,甚至一台主机上,由于系统业务量的增加,信息也以惊人的速度增加,海量的信息常常使网络或者主机系统成为信息处理的瓶颈。分布式处理系统的诞生解决了这些问题,它利用网络上各个节点来分担中央节点的负载。为保证各节点之间协同工作,最大限度地共享信息资源,因此就有了分布式系统的信息同步技术——复制。

LotusDomino/Notes是典型的分布式系统,它的体系结构决定了并发控制的复杂性。LotusDomino/Notes复制技术可以保证分布式数据库的数据同步,支持移动办公,其特性包括双向与端对端复制、字段级、选择性的、可以在后台进行等,所有的复制操作均采用相同的复制机制。

Notes采用权限控制的手段尽量避免让多个用户并发修改同一份文档。由于Notes的权限控制非常精细,可以指定每份文档的作者(只有文档作者才可编辑它),这样大大减少了多个用户编辑同一份文档的机会。

然而,有些情况下,流程中的某一环节(例如图1中的审查环节)有多个活动拥有者,均有权对文档进行编辑。在Notes中,出现这种情况时,只要用户修改的不是该文档的同一个域,系统在同步复制时还是可以进行信息合并的,即系统会自动识别新修改的信息并把它保存下来。如果发生多用户编辑同一份文档的同一个域的情况,为了避免更新数据丢失,系统会根据数据更新的时间与次数判断选出一个更新的文档作为主文档,另一份文档将会作为“保存冲突”文档(答复文档)显示在主文档下面,用户可以决定该数据的取舍。这样就最大限度地保护了并发写操作数据的一致性与完整性,而且不会对分布式系统性能造成不良影响。

3LotusDomino/Notes的排它锁并发控制模型

Notes提供的复制技术通过创建答复文档方式可以解决多用户并发访问的问题,但在某些情况下,这种解决方式也不是所有用户都能接受的。因为从业务角度看,虽然答复文档包含了某一个环节完整的信息,但用户可能并不需要一个主文档带多个答复文档的显示风格,且当下一环节的用户(活动拥有者)编辑文档时,他并不知道应该编辑哪一个文档。在这种应用背景下,Notes的保存冲突的解决方法就不适用了。

在分布式系统中,给信息加锁可解决并发写操作过程中更新数据互相覆盖的问题。为了弥补Notes保存冲突解决方法的不足,达到关系型数据库的并发访问控制效果,本文创建了一个排它锁模型,模拟其在Notes环境下的工作情况(如图2),具体说明如下:

1)用户编辑某一份文档之前,首先向服务器发出编辑申请;

2)服务器收到请求后检查文档状态,如果发现文档被锁定(其他用户正在编辑同一份文档),则拒绝用户

对文档的编辑申请;反之,则通过用户对文档的编辑申请;

3)用户得到对文档的编辑权限,一旦进入编辑模式,服务器就给文档加上锁;

4)用户编辑完成,保存并关闭文档时,服务器把加在文档上的锁去掉。

从上面的分析不难看出:当多个用户同时拥有同一份文档的编辑权限时,使用排它锁机制可以有效地进行并发控制,从而防止文档保存冲突的发生。

4文档编辑并发控制的设计

解决文档编辑并发控制的关键是排它锁,即在Notes中要尽量给需要的文档加上锁。在关系型数据库中,加锁的方式很简单,就是直接在数据表中增加一个标记字段(列)。需要加锁时把对应记录的标记字段设置为一个确定的值,解锁时把该标记字段设置为另外一个确定的值即可。在Notes中,在文档中用一个专门的标记字段(域)flag标示文档是否被锁定,例如字段值若为“1”则表示被锁定,若为“0”则表示未被锁定。

文档编辑并发控制的具体设计过程如下:

1)当用户欲编辑文档(文档从只读模式转换为编辑模式)时,如果用户是当前文档的编辑者,则会引发Querymodechange事件。

2)在Querymodechange事件中,检查文档对应的标记字段flag,若flag的值为“1”,则拒绝用户对文档的编辑,即文档处于只读模式;若flag值为“0”,则允许文档由只读模式变为编辑模式。

3)当文档处于编辑模式后,引发Postmodechange事件,在事件中需要把flag置为“1”,但服务器并不知道flag值的改变,因此必须进行一次保存操作,表示文档被锁定了,此时文档仍然处于编辑模式。

4)用户编辑完文档,需要对文档解锁。Notes表单提供了Querysave和Queryclose事件。Querysave事件在文档被保存之前引发,而Queryclose事件在文档被关闭前引发。用户编辑文档时,可以随时保存而不关闭文档继续进行编辑操作,因此解锁的代码写在Querysave事件中不合适,可以考虑在Queryclose事件中添加解锁代码。解锁的过程就是把flag置为“0”,并且保存文档。

5结论

并发控制是分布式应用系统中的一个重要问题,处理不好将导致系统数据的不一致。通过排它锁机制,可以解决基于LotusDomino/Notes应用系统中多个权力对等用户互斥访问同一文档的问题。基于LotusDomino/Notes的排它锁模型实现方法简单灵活,已经应用于西南计算中心办公自动化系统的课题申请模块中,达到了预期的设计目的,保证了系统数据的一致性。