代码之家  ›  专栏  ›  技术社区  ›  onedaywhen

Acedao支持行级锁定吗?

  •  3
  • onedaywhen  · 技术社区  · 15 年前

    DAO 3.6有一个问题,因为它不支持行级锁定。有关详细信息,请参阅 this Knowledge Base 文章。

    我从中学到了 Access team's blog :

    在Office Access 2007中,新对象, 将添加属性和方法 到DAO以支持 访问数据库引擎。

    从Access2007 VisualBasic编辑器的对象浏览器中查看这个库,新的化身称为Acedao。我可以在msdn上的修补程序中找到acedao.dll,但没有其他内容。

    有人知道在哪里可以找到Acedao的最终用户文档吗?

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

    2 回复  |  直到 14 年前
        1
  •  7
  •   onedaywhen    15 年前

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

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

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

    因此“工具”->选项中的用户设置确实决定了 用户 .要在这里真正清楚而不是拆分头发,UI的行锁定设置不会真正覆盖该选项,因为默认情况下它会强制执行该问题。

    请记住,当您打开该功能时行锁定的工作方式是,Jet引擎只是将记录的大小扩展到一个页面的大小,因此像以前一样使用普通的老式页面锁定。这就是我所说的强迫问题。如果用户打开了行锁定,那么它不会使bean的数量有所不同,然后您尝试用一个没有用行锁定打开reocrdset的记录集(与页锁定相反)来获取一个由用户锁定的记录。不允许锁定和编辑记录,因为这会再次降低到页面分辨率。

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

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

    首先,如果您将reocdset打开为page或row(如果用户已经用表单锁定了记录),则不会有任何不同。编辑数据的用户将确定有多少页面将被耗尽(如果启用了行锁定,则为整页数据)。

    第二个问题。您需要仔细考虑使用这个选项,因为它会导致文件膨胀得非常快,因为编辑的每个记录都将被强制占用一个数据库页面。如果您运行的代码更新了数千条记录,那么您可能不想这样做。但是,用户不能在一天中编辑那么多记录,并且使用每日压缩例程,它就不再是一个问题了。

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

    最后,只有当您有几个用户试图以相同的形式获取相同的数据时,此功能才真正适用。所以,这更多的是一个用户界面特性,而不是使用code+reocordset。

    您可能会发现ace+dao可以用行锁定打开reocrdset,但是为什么要担心呢?你不使用刀,你也不喜欢它。而且,无论如何也不可能改变你的用户场景。

    ——编辑:

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

    最近几天我真的很忙(我是2010测试版的一部分,周一还有向注册的公众发布的CTP)。所以,我最近真的很忙。

    但是,您可以尝试一些代码来显示这一点。以下代码会导致MDB中出现大约1兆的膨胀,而没有启用行锁定。(从Abou 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

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

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

    如果在上面运行时没有行锁定..文件会增加大约一兆。如果您在行锁定的情况下运行它,您可以获得超过110兆的数据文件增长。这确实是一个很大的区别。

        2
  •  0
  •   Community CDub    7 年前

    AcedaO在默认情况下至少和最有可能使用记录级锁定,与MS文档无关。这可以通过使用相同的DAO代码从底层的access 97 db切换到access 2000或accdb后发生的bloat(如上所述)来证明。

    有关更多详细信息,请参阅我的回答:

    Is it better to use ADO or DAO in Access 2007?

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

    “记录级锁定是ADO和DAO记录集对象的默认设置。页级锁定是使用ADO命令对象或DAO查询定义对象的SQL DML语句(批量操作,如更新、删除和插入到语句中)的默认值。”

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