页面锁定--多客户环境下VB数据库编程之(5)

2016-02-19 12:56 4 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享页面锁定--多客户环境下VB数据库编程之(5)的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

从理想的角度来说,如果能对记录进行锁定,则会给多用户程序带来极大的灵活性。然而遗憾的是,MicrosoftJet引擎不支持真正的记录锁定,而是使用页面锁定。页面锁定只锁定包含当前正在编辑的记录的页,MicrosoftJet进行访问和锁定的页的大小为2K(2048个字节)。在使用页面锁定时,其他用户可以读取锁定页中的数据,但不能对数据进行修改。在这种锁定方案中,每次将锁定多个记录,锁定的记录的个数取决于每个记录的大小。例如,如果每个记录的长度为230个字节,则每次只能锁定9个记录;而如果记录的长度为30个字节,则每次可锁定68个记录。
  
  锁定模式。页面锁定分为两种模式,即保守式锁定和开放式锁定,它确定了MicrosoftJet如何对数据进行锁定。当编写在页面级别上锁定数据的应用程序时,必须确定要使用哪种锁定模式。页面锁定可以通过两种方法来设置,即LockEdits属性和OpenRecordset方法中的lockedit5参数。
  
  1.用LockEdits属性指定锁定模式。锁定模式可以通过LockEdits属性来指定。该属性可用于各种Recordset对象,包括动态集、快照、表及动态类型的Recordset对象。LockEdits属性是一个布尔值,当把该值设置为True(缺省)时,将对记录集进行保守式锁定,即在执行Edit方法时锁定2K的页面:如果把该属性设置为False,则对记录集进行开放式锁定,即在执行UPdate之前不锁定要更新的记录所在的2K页面。如下面的例子:
  
  DimrstTemPAsReCordset
  ……
  rstTemp.LockEdits=True
  
  说明:a.锁定页面后,其它用户不能对正在编辑的记录所在页面进行修改,但可以读取锁定页中的数据。在其它用户锁定页面后,如果再把LockEdits属性设置为True,则会出错。b.如果把LockEdits属性设置为False,且其它用户已锁定页面,则其后的用户在使用Update时将会出错。c.当与Microsoft连接的ODBC数据源一起操作时,LockEdits属性被设置为False,即开放式锁定。
  
  2.用OpenRecordset方法指定锁定模式。我们已多次使用过OpenRecordset方法,该方法的格式如下:
  
  Setrecordset=object.OpenRecordset(type,options,lockedits)
  
  其中第三个参数,即lockedits,用来指定锁定模式或以只读方式打开记录集。该参数可以取以下5种值:
  
  (1)dbReadOnly:以只读方式打开记录集。注意,在options参数中也可以使用dbReadOnly,但不能同时使用,否则会产生错误。
  
  (2)dbPessimistic:用保守式锁定模式打开记录集,一旦使用Edit方法,将立即锁定正在编辑的记录所在的页面,直到执行Update方法后才释放对该页面的锁定。
  
  (3)dbOptimistic:用保守式锁定模式打开记录集,在执行Update方法前不锁定正在编辑的记录所在的页面。
  
  (4)dbOptimisticValue:基于行值使用开放式并发(仅ODBCDirect工作区)。
  (5)dbOptimisticBatch:允许开放式更新(仅ODBCDirect工作区)。
  
  保守式锁定和开放式锁定。
  
  1).保守式锁定。保守式锁定也称为悲观锁定。设置保守式锁定后,只要对某个记录使用Edit方法,就自动锁定该记录所在的页面,直到显式地提交或取消这个记录的变更(例如执行UPdate方法)后,才释放对该页面的锁定,并把数据写入文件中。保守式锁定是Recordset对象的缺省锁定方式。保守式锁定的主要优点是,获得锁定之后,只要记录还被锁定着,就可以防止其它用户修改该记录中的数据,因此不会发生任何锁定冲突。另外,由于一个用户不能在另一个用户开始编辑记录之后改变它,所以,保守式锁定也是保证应用程序读取最新数据的唯一方法。保守式锁定的缺点是,在编辑和锁定该记录的过程中,包含该记录的整个页面都被锁定。当锁定时间较长时,可能会给其它用户造成不必要的麻烦。例如,用户设置保守式锁定后,开始编辑一个记录,并在记录被锁定期间离开了计算机(例如出去办事),这不仅锁定了用户正在编辑的记录,而且锁定驻留在该锁定页面内的其它记录,使其它用户长时间内无法编辑页面中的记录。
  
  2).开放式锁定。开放式锁定也称乐观锁定。使用开放式锁定时,MicrosoftJet引擎仅在试图用Update方法提交记录变更时才锁定页面,完成更新操作后立即释放对页面的锁定。由于锁定仅在应用程序试图提交变更时发生,因此能使锁定的时间最短,使其它用户只在锁定生效的较短时间内不能访问该页面。这是开放式锁定的主要优点。开放式锁定的缺点是:当用户正在编辑记录时,不能保证更新是否会成功。如果另一个用户改变了第一个用户正在编辑的记录,那么依赖于开放式锁定的更新将会失败。例如,假定张三和李四正在编辑同一个记录,张三开始以开放式锁定编辑某个客户记录。由于张三使用的是开放式锁定,并没有真正锁定记录,所以不能禁止李四试图编辑相同的记录。在李四编辑相同的客户记录时,他不知道张三正在编辑该记录,并且也没有看到最新的数据。当张三试图在李四编辑相同的客户记录时存储他的变更,就会产生一个错误。对于大多数数据库应用程序来说,可能要选择开放式锁定,因为其它用户修改或删除本人正在使用的记录的可能性要小于试图访问已被锁定的页面上记录的可能性。但是,如果某个应用程序中有多个用户同时访问和编辑记录,则应使用保守式锁定,以确保在执行编辑期间记录不被其他人修改。在这种情况下,应注意不要使记录锁定的时间过长。
  
  3).释放锁定。如前所述,在执行Update方法后,将自动释放页面锁定。但是,释放记录锁定是一种后台进程,有时候,其它操作发生得很快,以至于数据库来不及处理该进程。如果正在开发一个数据输入密集型的应用程序,则可能需要暂停应用程序的处理,这可以通过MicrosoftJet数据库引擎的Idle方法来完成。Idle方法挂起数据处理,启用MicrosoftJet数据库引擎执行其它操作,诸如内存优化或内存页超时等(仅MicrosoftJet工作区)。该方法用于DBEngine对象,格式如下:
  
  DBEngine.Idle[dbRefreshCachel
  
  在多用户环境中,用Idle方法可以使MicrosoftJet数据库引擎执行后台任务。在一般情况下,仅当没有任何操作(包括移动鼠标)发生时,才释放读锁定并更新本地动态集类型的Recordset对象中的数据。如果定时地使用Idle方法,则MicrosoftJet可以释放不必要的读锁定,以捕获后台处理任务。Idle方法有一个可选的参数,即dbRefreshCache,如果使用该参数,则可强制挂起写入.MDB文件,并用.MDB文件中的最新数据刷新内存。->

来源:https://www.tulaoshi.com/n/20160219/1602492.html

延伸阅读
空字段的处理 在往SQLServer数据库中添加记录时,每个字段必须给予明确赋值(即在没有给数据表设定缺省规则或给每个字段设定缺省值的情况下),否则便发生错误。因此我用VB编写了一个处理函数,将其放入标准模块,以供相应程序调用。函数首先判断是否给字段赋值,若没有,则根据字段类型的不同赋予不同数值(数字赋零,字符赋空格)。...
长期用VB50进行数据库应用软件的编程,遇到过不少问题,走了不少弯路,也积累了不少经验。在此,将它们做个小结,希望对同样从事VB50编程的朋友有所帮助。 1、在Form_Load事件中不能对Data控件进行控制 如果确实需在窗体被打开时使用Data控件,可在Form_Activate事件中进行控制。由于Activate事件在窗体被激活时发生,就是说在窗体...
标签: vb
DAO(Data Access Object)全称为数据访问对象,它是数据库编程的重要方法之一。DAO的一种面向对象的界面接口,特色为它不是可视化的对象,使用它全部都要靠编码来完成,DAO是设计关系型数据库系统结构的对象类的集合。它提供了完成管理这样一个系统所需的全部操作的属性和方法,包括创建数据库,定义表、字段和索引,建立表间的关系,定位...
目前许多建立和应用信息系统的企业,在系统应用不断改进的同时,开始注意提高企业信息系统的可用性和可靠性。通过双机容错系统为企业提供系统高可用性保障是目前企业普遍采用的方法。医疗机构工作性质的特殊性要求其信息系统7天×24小时不间断运行,采用双机容错方案为系统提供了高可用解决方案。本文将对医疗信息系统的双机容错环境下Orac...
从前面的介绍可以看出,可以为各种类型的数据库管理系统编写VisualBasic前端。事实上,使用ODBC驱 动程序,可以建立与几乎任何数据库管理系统连接的应用程序。这一节中,将介绍可以与VisualBasic数据库应用程序一起使用的几种数据库管理系统。 普通的关系数据库管理系统 普通的关系数据库管理系统(RDBMS)一般是指传统的桌面RDB...

经验教程

774

收藏

100
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部