你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
基于VB的多客户环境下的数据库访问策略
 

 :本文介绍了VB应用程序中多客户环境下的数据库的锁定策略,并描述了每种策略的管理和实现方法。

关键词:多客户环境、数据库锁定、Microsoft Jet

 

一、引言

在客户/服务器系统中,应用程序一般分为两种情况:一种是把整个应用程序放到网络服务器上,允许多个用户打开数据库。在这种情况下,用户可以共享组成应用程序的所有数据库对象,包括存储数据的表。另一种是把应用程序分为两个数据库(双数据库):一个是包括应用程序数据表的后端数据库,另一个是包含应用程序其它对象(查询、窗体、报表、宏和模块)的前端数据库,前端数据库还可以管理临时对象。后端数据库放到网络服务器上,而前端数据库分发给用户,使来自后端数据库的连接表作为前端数据库对象的基础。在多用户环境中,双数据库方法具有较为明显的优势,因为应用程序不必建立可能与另一个用户发生冲突的临时表。因此,在用户工作站上存储前端数据库,可以避免对临时对象的争用;同时,由于在本地存储静态对象,因而当应用程序运行时,可以使网络通信量减少到最小。

VB应用程序中,单用户访问数据一般不会发生资源请求冲突,但在多客户环境中,当用户访问数据库时,可能会产生冲突。为了管理这些冲突,Microsoft  Jet提供了数据访问控制和应用程序的锁定服务,以保证在给定的时间内只有一个用户可以访问数据库。“数据访问控制”用来对数据库的部分或全部进行访问限制,通常分为两类,一类是用户限制,即用来阻止某些人查看或修改“敏感”数据,如在工资系统中,大多数人可以查看员工的工资,但只有少数人有权修改实际的工资信息。“功能限制”只对程序的某个部分起作用,而不管用户是谁。如在订单登记系统中把价格表设为只读模式,即可防止用户随意修改某些项目的价格。

二、数据库的锁定策略

21、互斥地使用数据库

以互斥方式打开数据库是对数据访问施加的最大限制,它实际上是以“独占”方式使用数据库,这种限制可以阻止任何用户或程序访问正在使用的数据库中的信息,由于这种方式的限制太大,因而只用于那些影响这个数据库的操作,包括压缩数据库、更新整个表(如用UPDATE查询)、通过添加表、字段或者索引来修改数据库的结构、处理特殊的用户需求(例如传送审计信息)等。在Microsoft Jet引擎中,缺省的数据库访问模式是共享数据库访问。在这个模式中,Jet引擎采用了对数据库的页锁定技术,如果要独占打开数据库,就要向openDatebase的第二个参数传递一个True值,用如下语句实现:

Dim db as Datebase

Dim dbname as string

Set db=dbengine.workspaces(0).openDatebase(dbname,true,false)

上式中dbname为数据库存放的路径,若要共享打开数据库,可将true去掉或显示声明false。用上面的代码打开数据库时,如果该数据库未被其他用户使用,则打开数据库,这样直到关闭之前,该数据库不会被其他用户或程序访问;如果数据库正在被其他用户使用,则返回一个错误。

22、对数据库中表的锁定

在开发一个多用户的应用程序中,以独占方式打开数据库的方法局限性太大,以致很少使用,如果采用表的锁定,可以使你的数据库有更灵活的管理能力,对表的锁定包括“禁止读”和“禁止写”两种方式,用下列语句实现:

Dim db as Datebase

Dim rs as Recordset

Dim dbname as stringDim tablename as string

Set db=DBEngine.Workspaces(0).openDatebase(dbname)

Set rs=db.OpenRecordset(TablenamedbOpenTableOptionsLockEdits)

上式打开数据集的语句中,参数dbOpenTable表示记录集的类型,这个参数能用dbOpenDynasetdbOpenSnapohotdbOPenDynamicdbOpenForward Only取代。Option选项有两种操作方法,即dbDengRead,它拒绝对其他用户的读许可,另一个操作是dbDengWrite,它拒绝对其他用户的写许可,可以通过这两个选项,便可以独占的方式打开一个表或给予其他用户部分的共享权力。LockEdits参数也有两个选项,其一是dbPessimistic,它是缺省值,即调用Edit方法时页被锁定,另一选项是dbOptimistic,即调用Update方法时页被锁定。

23、页面锁定

从理想的角度来说,如果能对记录进行锁定,则会给多用户程序带来极大的灵活性。然而遗憾的是,Microsoft  Jet引擎不支持真正的记录锁定,而是使用页面锁定。页面锁定只锁定包含当前正在编辑的记录的页,Microsoft  Jet进行访问和锁定的页的大小为2K2048个字节)。在使用页面锁定时,其他用户可以读取锁定页中的数据,但不能对数据进行修改。在这种锁定方案中,每次将锁定多个记录,锁定记录的个数取决于每个记录的大小。页面锁定分为两种模式,即保守式锁定和开放式锁定。

所谓保守式锁定也称为悲观锁定,设置保守式锁定后,只要对某个记录使用Edit方法,就自动锁定该记录所在的页面,直到显式地提交或取消这个记录的变更(例如执行UPdate方法)后,才释放对该页面的锁定,并把数据写入文件中。保守式锁定是Recordset对象的缺省锁定方式。保守式锁定的主要优点是可以防止其它用户修改该记录中的数据,因此不会发生任何锁定冲突。另外,由于一个用户不能在另一个用户开始编辑记录之后改变它,所以,保守式锁定也是保证应用程序读取最新数据的唯一方法。保守式锁定的缺点是,在编辑和锁定该记录的过程中,包含该记录的整个页面都被锁定。当锁定时间较长时,可能会给其它用户造成不必要的麻烦。

开放式锁定也称乐观锁定。使用开放式锁定时,Microsoft  Jet引擎仅在试图用Update方法提交记录变更时才锁定页面,完成更新操作后立即释放对页面的锁定。由于锁定仅在应用程序试图提交变更时发生,因此能使锁定的时间最短,使其它用户只在锁定生效的较短时间内不能访问该页面。这是开放式锁定的主要优点。开放式锁定的缺点是:当用户正在编辑记录时,不能保证更新是否会成功。如果另一个用户改变了第一个用户正在编辑的记录,那么依赖于开放式锁定的更新将会失败。对于大多数数据库应用程序来说,可能要选择开放式锁定,因为其它用户修改或删除本人正在使用的记录的可能性要小于试图访问已被锁定的页面上记录的可能性。但是,如果某个应用程序中有多个用户同时访问和编辑记录,则应使用保守式锁定,以确保在执行编辑期间记录不被其他人修改。在这种情况下,应注意不要使记录锁定的时间过长。

这两种锁定模式可以通过两种方法来设置,即LockEdits属性和OpenRecordset方法中的LockEdits参数。

231、用LockEdits 属性指定锁定模式。锁定模式可以通过LockEdits属性来指定。该属性可用于各种Recordset对象,包括动态集、快照、表及动态类型的Recordset对象。LockEdits属性是一个布尔值,当把该值设置为True(缺省)时,将对记录集进行保守式锁定,即在执行Edit方法时锁定2K的页面:如果把该属性设置为False,则对记录集进行开放式锁定,即在执行UPdate之前不锁定要更新的记录所在的2K页面。如下面的例子:

Dim rstTemP As ReCordset

……

rstTemp.LockEditsTrue

说明:、锁定页面后,其它用户不能对正在编辑的记录所在页面进行修改,但可以读取锁定页中的数据。在其它用户锁定页面后,如果再把LockEdits属性设置为True,则会出错。、如果把LockEdits属性设置为False,且其它用户已锁定页面,则其后的用户在使用Update时将会出错。、当与Microsoft连接的ODBC数据源一起操作时,LockEdits属性被设置为False,即开放式锁定。

232、用OpenRecordset方法指定锁定模式。我们已多次使用过OpenRecordset方法,该方法的格式如下:

Set recordsetobject.OpenRecordset(typeoptionslockedits)

其中第三个参数,即lockedits,用来指定锁定模式或以只读方式打开记录集。该参数可以取以下5种值:

(1)dbReadOnly:以只读方式打开记录集。注意,在options参数中也可以使用dbReadOnly,但不能同时使用,否则会产生错误。

(2)dbPessimistic:用保守式锁定模式打开记录集,一旦使用Edit方法,将立即锁定正在编辑的记录所在的页面,直到执行Update方法后才释放对该页面的锁定。

(3)dbOptimistic:用保守式锁定模式打开记录集,在执行Update方法前不锁定正在编辑的记录所在的页面。

(4)dbOptimisticValue: 基于行值使用开放式并发(ODBCDirect工作区)

(5)dbOptimisticBatch:允许开放式更新(ODBCDirect工作区)

24、释放锁定

如前所述,在执行Update方法后,将自动释放页面锁定。但是,释放记录锁定是一种后台进程,有时候,其它操作发生得很快,以至于数据库来不及处理该进程。如果正在开发一个数据输入密集型的应用程序,则可能需要暂停应用程序的处理,这可以通过Microsoft Jet数据库引擎的Idle方法来完成。Idle方法挂起数据处理,启用Microsoft  Jet数据库引擎执行其它操作,诸如内存优化或内存页超时等(Microsoft  Jet工作区)。该方法用于DBEngine对象,格式如下:

DBEngine.Idle[dbRefreshCachel

在多用户环境中,用Idle方法可以使Microsoft  Jet数据库引擎执行后台任务。在一般情况下,仅当没有任何操作(包括移动鼠标)发生时,才释放读锁定并更新本地动态集类型的Recordset对象中的数据。如果定时地使用Idle方法,则Microsoft  Jet可以释放不必要的读锁定,以捕获后台处理任务。Idle方法有一个可选的参数,即dbRefreshCache,如果使用该参数,则可强制挂起写入数据库,并用数据库文件中的最新数据刷新内存。

三、结束语

综上所述,我们对多用户应用程序设计中最主要的问题,即控制数据的锁定进行了探讨。但是,应当指出,锁定并不是多用户应用程序设计中唯一的问题,本文对多客户环境下数据库的储存方式、访问控制、共享数据的锁定等进行了分析,提出了多用户环境下的数据库锁定的解决方案。

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089