3

DAO 3.6 存在一个问题,它不支持行级锁定。有关详细信息,请参阅此知识库文章。

我从Access 团队的博客中了解到:

在 Office Access 2007 中,将向 DAO 添加新对象、属性和方法,以支持 Access 数据库引擎中的新功能。

通过在 Access2007 Visual Basic 编辑器的对象浏览器中查看这个库,新的化身称为 ACEDAO。我可以在 MSDN 上的修补程序中找到对 acedao.dll 的提及,但仅此而已。

有谁知道在哪里可以找到 ACEDAO 的最终用户文档?

如何发现 ACEDAO 是否支持行级锁定?

4

2 回答 2

7

我不相信那篇知识库文章有任何变化。但是,您必须记住记录锁定是如何实现的。

请记住,当网络上的任何用户打开任何表时,并且他们启用了行锁定,那么 DAO/ADO/ACE 如何在代码中打开该表就无关紧要了。

任何具有行锁定的现有用户都将强制对他们正在使用的记录进行行锁定。而且,由于记录集代码很少会在任何合理的时间内保持记录打开/锁定,因此页面锁定或行锁定在这里很少会产生影响。因此,在大多数情况下,当您让用户在表单中编辑数据时,需要锁定。在代码的情况下,它往往是一个罕见的问题。

所以 tools->options 中的用户设置确实决定了用户的这个选择。为了在这里真正清楚而不是分裂头发,UI 的行锁定设置并没有真正覆盖选择,就像默认情况下它强制问题一样。

请记住当您打开该功能时行锁定的工作方式,喷气引擎只是将记录的大小扩展到一页的大小,因此就像以前一样使用普通的老式页面锁定。这就是我所说的强制问题。如果用户打开了行锁定,它不会使大量的 bean 变得不同,然后您尝试获取由用户锁定的记录,该记录集没有打开带有行锁定的 reocrdsset(与页面锁定相反)。您不能锁定和编辑记录,因为这又归结为页面分辨率。

没有真正的行锁这样的东西。但是,如果您将记录的大小扩展为始终为一页,那么您会以迂回的方式实现相同的目标。

鉴于上述信息,这意味着两件事:

首先,如果用户已经用表单锁定了记录,那么如果您将 reocdset 作为页面或行打开,这不会有任何区别。编辑数据的用户将确定将要使用多少页面(如果打开行锁定,则它是一整页数据)。

第 2 期。您需要仔细考虑是否使用此选项,因为它会导致文件快速膨胀,因为每条编辑的记录都将被迫占用一个数据库页面。如果您正在运行更新数千条记录的代码,那么您可能不想这样做。然而,用户不能在一天内真正编辑那么多记录,并且通过每日压缩例程,它不再成为问题。

从逻辑上讲,这意味着该选项实际上仅对在相互绊倒时编辑数据的用户有用。然而,对于记录集代码,使用行锁定几乎没有帮助,甚至不适合。

归根结底,只有当您有多个用户试图以相同的形式获取相同的数据时,该功能才真正适用。因此,这更像是一个用户界面功能,而不是使用代码 + 记录集的功能。

您可能会发现 ACE + dao 可以打开带有行锁定的 reocrdset,但何必担心呢?你不使用 dao,反正你也不喜欢它。而且,它无论如何都不会改变你的用户场景。

- 编辑:

我没有方便的链接来解释此记录页面锁定。我知道我在某处读过这个,但我没有链接。

这几天我真的很忙(我是access 2010 beta的一部分,周一还有CTP发布给公众注册的人)。所以,我最近真的很忙。

但是,您可以尝试一些代码来显示这一点。以下代码在未调整行锁定的情况下导致 mdb 中出现大约 1 兆的膨胀。(它从大约 5.8 兆到大约 6.5)。

Dim rst        As DAO.Recordset
Dim i          As Long
Dim t          As Single

Set rst = CurrentDb.OpenRecordset("contacts")

t = Timer
Me.Text1 = "working..."
DoEvents
Do While rst.EOF = False
   rst.Edit
   i = i + 1
   rst!City = "ci " & i
   rst.Update

   rst.MoveNext

   If i Mod 500 = 0 Then
      Me.Text1 = i
      DoEvents
   End If


Loop

t = Timer - t
Me.Text1 = "done in " & t & " seconds"
Beep

如果在打开记录锁定的情况下运行相同的代码,文件的大小将达到 123 兆。这是一个示例 mdb 的链接,其中包含上述代码

http://www.kallal.ca/test/bloat.zip

所以,在上面下载。使用工具->选项->高级->使用行级锁定打开它。

然后,清空桌子。紧凑和维修。更改上述设置并再次运行它(确保退出,然后在更改该设置后重新进入数据库)。

如果你在没有行锁定的情况下运行..文件增加了大约 1 兆。如果您在行锁定的情况下运行它,您将获得超过 110 兆的数据文件增加。这确实是一个非常大的差异。

于 2009-07-13T19:09:03.730 回答
0

无论 MS 文档如何,ACEDAO 至少也最有可能默认使用记录级锁定。这可以通过使用相同的 DAO 代码从底层 Access 97 DB 切换到 Access 2000 或 ACCDB 后发生的膨胀(上面提到的)来证明。

有关更多详细信息,请在此处查看我的答案:

在 Access 2007 中使用 ADO 还是 DAO 更好?

编辑以反映包含正确信息的 MSDN 链接:

"Record-level locking is the default for ADO and DAO Recordset objects. Page-level locking is the default for SQL DML statements (bulk operations such as UPDATE, DELETE, and INSERT INTO statements) that use ADO Command objects or DAO QueryDef objects."

http://msdn.microsoft.com/en-us/library/aa165435(office.10).aspx

于 2011-01-17T18:47:13.410 回答