| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vb >> 数据库 >> 文章正文
页面锁定的锁定方案            【字体:
页面锁定的锁定方案
作者:-    文章来源:-    点击数:    更新时间:2006-6-10

如前所述,Microsoft Jet不能锁定单个的记录,每次读、写以及锁定的都是一页数据,面不是一个记录。根据记录的大小,一页可能包含多个记录。当锁定一个记录时,就会锁定那一页上的所有记录,如图86所示。

在高并发应用程序中,要求对指定记录提供畅通无阻的访问。可以用不同的策略来实现设计。

1.使用Text类型。可以用Text数据类型把字段添加到表中,直到记录长度超过1024个字节。由于Text是变长数据类型,必须显式地用数据来填补字段以获得一个定长格式。同时,这种技术可能会降低性能,因为如果每个记录都占用2K磁盘空间,则数据库的长度将会增加。因此,建议不要使用Text 数据类型。

2. 使用CHAR类型。SQL DDL CHAR 是一种定长数据类型。如果使用这种类型,则可不必用数据来填补字段。使用CHAR数据类型是实现这种技术的最简单而且保险的唯一方法。

3.使用开放锁定。另一种策略是:在任何地方都使用开放方式锁定。虽然开放式锁定不能避免页面锁定,但它可以使记录被锁定的时间最短,因此降低了不需要锁定的记录也被锁定的可能性。

4.使用自定义的锁定方案。有时候,页面锁定不能满足需要,而开放式锁定也可能无法满足需要。在这种情况下,可以考虑使用自定义的锁定方案。当一个记录被锁定时,可以用一个锁定表来标识。锁定表存储记录的键值、锁定状态(锁定或未锁定)以及锁定记录的用户名等。自定义锁定方案的实现需要大量的设计、实现以及测试时间。在许多情况下,它不能与内置的Microsoft Jet的功能重复。例如,即使实现单记录锁定,处理基于多个表的记录集的数据也是非常困难的,因为必须标识所有表,而这些表都包含必须锁定的记录。当自定义锁定方案只影响几个表,而且不是基于一个具有复杂连结和关系的数据模型时,使用自定义锁定方案较为适宜。

页面锁定中的错误处理

当使用页面锁定时,必须在代码中检查是否成功地实现了锁定。在开始时应禁止错误处理程序,然后尝试完成初始化一个锁定、检查错误,最后允许错误处理程序。在多用户环境下,所遇到的页面锁定错误有三种,见表。

错误代码和出错信息 原因和建议的操作
3186 不能存储;当前正被机器<nane>上的<name>用户锁定 当一个用户试图更新一页,而这一页包含了另一个用户设置的读锁定时,就会发生这个错误。为了处理这个错误,可以先等待一会儿,然后重新存储该记录。也可以通知发生这个问题的用户,并询问他们是否想要重试该操作
3197因为和另一个用户试图同时改变同一个数据,所以MicrosoftJet数据库引擎终止了该过程 在打开记录集或最后一次从记录中读取数据之后,另一个用户对当前记录作了更改,并使用Edit方法或Update方法时,就会产生这个错误。如果在使用Edit方法时产生了这个错误,就要用当前数据来刷新用户的数据视图然后再试一次Edit方法。如果这个错误是在使用update方法时发生的,则是因为使用了开放式锁定,并且在使用Edit方法后记录发生了变更。在这种情况下,应通知用户,其他人已经改变了数据。可以显示出当前数据并让用户选择:是覆盖其他用户的变更,还是取消编辑
3260不能更新;当前,被机器 <name> 上的 <name>用户锁定 锁定了包含当前记录的页面,并使用AddNew或Edlt方法时,就会发生这个错误。在使用Update方法来把一个记录存储到一个锁定的页面时,也会发生这个错误。在用户存储新的记录,或者在使用了开放式锁定后,另一个用户又来锁定该页面时,就会发生这种情况。为了处理这个错误,可等待一会儿,然后再试一次存储该记录。可以将该问题通知用户,并让用户决定是否要重试这个操作

用错误代码和出错信息可以测试记录是否被锁定。下面的过程可用来检测当前记录是否在一个锁定的页面上:

Function RecordLocked(rst As Recordset)AsBoolean

Dim blnLock As Boolean

On Error GoToErrorHandler

blnLockrst.LockEdits '保存LockEdits属性的当前值

rst.LockEditsTrue '设置保守式锁定

rst.Edit '试着编辑记录,如果记录被锁定,则会产生错误3197

RecordLockedFalse

rst.CancelUpdate

rst.LockEditsblnLock '恢复LockEdits属性的值

EXit FUnction

ErrorHandler

Select Case Err

Case 3197

Resume Next

Case Else

RecordLockedTrue

Resume Next

EXit Function

End Select

End Function

该过程把记录集的锁定设置为保守式,并编辑记录,以测试当前记录是否在一个被锁定的页面上,如果记录被锁定,则会产生一个错误(3197)。该过程有一个参数,即rst,它是Recordset对象。调用该过程,将返回一个布尔值。为了调用该过程,可以在窗体上画一个命令按钮,然后编写如下事件过程:

Private Sub Command1_Click()

Dim dbs As Database

Dim tb As Recordset

Dim bl As Boolean

Set dbsopendatabase("c:\dbdir\dbl.mdb",dbopenDynaset)

Settbdbs.OpenRecordset("tablel",dbOpenTable)

blRecordLocked(tb)

End Sub

在该事件过程中,打开一个数据库和该数据库中的表,然后用记录集作为参数调用上述过程,调用结果放在变量bl中。如果记录被锁定,则返回值为True,否则为False

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 用VB编写DirectX7.0游戏(下…

  • 用VB编写DirectX7.0游戏(上…

  • 使用OLE DB和ADO调用返回记录…

  • 使用VB调用Oracle程序包内的…

  • VB中用ADO对象动态创建数据库…

  • fffff

  • 如何用MSComm Control传Bina…

  • MultiLink的WinSock Server程…

  • 用VB制作浏览器

  • 用VB编写网络寻呼机

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |