【问题标题】:How are records stored in a MS Access page? Can a record be stored in two pages?记录如何存储在 MS Access 页面中?记录可以存储在两个页面中吗?
【发布时间】:2011-03-14 12:38:57
【问题描述】:

我有两个 VC++ 6 应用程序在通用 Access 2000 数据库中写入/更新数据 - 两个应用程序都从不同的数据记录器下载信息。

在尝试进行添加/编辑/更新时,我们经常会遇到异常:

(3260) 无法更新;目前 被机器上的用户“管理员”锁定 'abc123'。

我确信问题与数据库中的记录锁定有关。

我们正在使用 CDaoRecordset 来访问数据。从阅读文档看来,默认设置是乐观地锁定记录所在的数据库页面。如果另一个进程尝试编辑/更新同一页面中的记录,他们会收到我们看到的错误。

此时迁移到 SQL Server 不是一个选项 - 由于事物的结构方式,这不是一个简单的更改。

我想知道是否可以使受影响表中的记录足够大,以便每个 2k 数据页中只有一条记录。如果我使每条记录的长度为 1100 字节,那么每条记录都应该有自己的页面,从而解决了锁定问题。我知道它会占用更多磁盘空间,但目前这不是问题,因为受影响的表的容量非常小。

这行得通吗? Access 2000 中的记录可以分成两页吗?

【问题讨论】:

    标签: database visual-c++ ms-access


    【解决方案1】:

    为了避免锁定冲突而膨胀记录并不是一个非常实用的方法。一方面,Access 数据库限制为 2 Gb。这包括系统表。我建议您捕获错误并再次尝试该操作。不了解 C++,我无法为您提供执行此操作的代码,但我假设您已经知道如何执行此操作。

    【讨论】:

    • 我选择了这个作为答案,因为这是我们最终要做的。
    【解决方案2】:

    从查看 Access 97/Jet 3.5 和 Access 2000/Jet 4.0 的行为差异来看,我相信 Access 2000 中的新记录已经放置在它们自己的页面中。与 Access 97 文件相比,我注意到 Access 2000 数据库文件中的“膨胀”更多。

    因此,我怀疑您的问题更多与基本表和索引锁定有关,而不是与记录锁定有关。更新所有索引可能需要一段时间,即毫秒。正如比尔所说,重试该操作。我建议添加 10 或 50 毫秒的延迟。并将重试次数限制在 10 次。

    【讨论】:

    • 我看到的两篇 Access 民间传说的报道但有一些疑问是,在 Jet 4.0 及更高版本中打开记录级锁定会导致每条记录存储在单独的数据页上。我不相信这是正确的。其次,民间传说说 DAO 只能使用页级锁定,而 ADO 可以使用记录级锁定。我在文档中看到了似乎与此相矛盾的证据。
    【解决方案3】:

    随机自动编号 PK 可能允许您增加并发性,因为 Jet/ACE 表以集群方式存储在 PK 上(即按 PK 顺序)。使用随机自动编号,压缩表将以随机顺序存储,而不是旧记录在顶部,新记录在最后聚集在一起。

    但是,compact 之后添加的记录将在临时碎片数据页中,而不是按集群 PK 顺序,所以我实际上不知道这是否在实际意义上增强了并发性。这可能只是理论上的(即,您必须在添加每条记录后进行压缩)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多