【问题标题】:Access: Record Locks - Edited Record property not working correctly访问:记录锁定 - 编辑的记录属性无法正常工作
【发布时间】:2020-12-08 07:24:51
【问题描述】:

我对 Access 还很陌生,并且正在努力设置悲观的记录锁定策略(已编辑记录)。我有一个我正在开发但尚未发布的数据库,所以它目前没有拆分,但将是最终形式。我有几个表将由多个用户同时通过表单访问,理想情况下,我希望将这些表单的 Record Locks 属性设置为逐行编辑记录,这样一旦用户开始编辑一条记录,其他用户不能乱用它,但仍然可以编辑所有其他记录。我有:

  1. 将相关表单的记录锁定属性设置为已编辑记录
  2. 启用“使用记录级锁定打开数据库”高级选项
  3. 数据库所在文件夹的读/写权限

..但它不能正常工作。似乎 Access 仍在页面级别锁定记录,因为我无法同时编辑两个相邻或“关闭”(彼此相距 30 行左右)记录。

我什至尝试创建一个全新的数据库,只有一个表和两个表单(实际上一个表单用两个不同的名称重复) - 结果是一样的,一旦我开始在一个表单中编辑一行数据,所有“附近”行也被锁定,无法编辑。我尝试拆分数据库,请另一个用户和我一起在他的机器上尝试,但总是相同的结果。我可能有什么问题?

如果需要,我可以分享我作为测试制作的全新数据库,但不确定我可以上传到哪里。

【问题讨论】:

    标签: ms-access ms-access-2016


    【解决方案1】:

    好的,有几件事:

    鉴于这不是拆分?好的,要检查的东西少了。

    所以,你有这个设置:

    对于有问题的测试表,你有这个:

    现在,我们假设您不会在这里遗漏一些巨大的巨无霸,对吧?

    首先 - 我们假设没有其他人,或者没有其他程序打开此文件。

    我们假设您根本没有任何启动代码 - 但只是启动到该表单?对(如果你有启动代码——尤其是打开数据库或打开表的任何代码?所有的赌注都关闭了!

    下一步:因为这是一台单用户机器 - 我会重新启动 - 只是为了确保没有任何杂散的 Access 正在运行或由于所有这些测试而继续运行。

    请注意,表格必须打开相关表格。在 Access UI 应用程序通过表单打开该表之前运行任何类型的代码。

    以上内容非常重要!!!

    为什么?

    因为 DAO 代码、VB 代码或任何其他在您的访问应用程序之前打开文件的程序或过程?然后你不会得到行锁定。

    以上提示还包括任何 VBA + DAO 代码!!!

    您看,JET(现在是 ACE)行锁定功能?使用此功能只有一种方式,而且只有一种方式:

    它仅适用于 MS-Access UI。这意味着在 Access UI(表单)打开单个表之前,没有 VBA 代码可以执行此操作,没有 vb.net 代码或任何其他系统或代码可以运行。

    为什么?

    第一人称+进程将确定行锁定功能是否开启。我想再三强调一下,只有 UI 才能使 ACE/JET 数据引擎使用此行锁定功能。

    换句话说: 如果在应用程序启动时运行打开表的任何代码(DAO 或 ADO 代码),那么首先打开数据库的代码将从那时起强制所有其他程序、表单甚至 MS-Access 表单不使用行锁定。 (您会获得页面锁定)。

    所以,这是第一次设置。

    导致表打开的第一个进程将确定是否要打开行锁定。发生这种情况的唯一可能方式是 MS-Access UI 打开一个带有表单的表(任何表)。在 UI 打开表格之前,您不能运行任何触及表格的代码。因此,任何类型的启动代码,甚至是创建持久连接的代码(相当常见)都会忽略行锁定功能。

    如果有任何其他外部程序,比如 FoxPro 中的 ODBC,或者甚至是 vb.net、c# 等中的代码,在 Access UI 拿到表之前打开数据库?然后再一次,不使用行锁定(当然会使用页面锁定)。

    因此,不能在代码中设置翻转、标志、行锁定开关。 (您可以通过代码在访问中设置选项 - 但随后您会收到有关必须重新启动访问的提示(如果您更改该行锁定功能,则必须这样做)。因此,代码可以更改设置,但永远不会直到你重新启动才会生效。因此,代码不能在启动时设置它(只更改告诉访问在启动时要做什么的设置 - 一旦代码开始运行,在代码中更改它为时已晚。

    因此,请记住,您首先需要启动某个绑定到表格的表单,并且该表单必须在任何 DAO 或任何其他类型的 VBA 代码抓取或打开一个表格之前首先运行通过 DAO 或 ADO 代码表。

    如果代码使用 DAO/ADO 对象模型,那么您会绕过 Access UI,因此无法告诉 JET/ACE 使用行锁定。这是 MS-Access 功能,而不是 JET/ACE 数据引擎功能。因此,您必须确保打开该表的是 Access UI。一旦发生这种情况,那么任何和所有其他代码、表单甚至外部 ODBC 连接现在都将遵循行锁定功能。

    【讨论】:

    • 你好 Albert,你的观点很清楚,但是我不认为你提到的在这里起作用。我在原始帖子中很快提到我曾尝试创建一个全新的数据库并看到相同的行为,所以让我扩展一下我所做的,但首先请注意我确实重新启动了我的电脑并重新测试,我我仍然得到相同的结果。
    • 我在我的电脑上创建了一个全新的数据库,打开它,创建了一个包含两个字段的表并添加了 3 条记录。我根据表格创建了一个表格,并用不同的名称复制了它。然后我同时打开了两个表单,我看到的是,只要两个表单中的一个正在编辑 3 行中的任何一个中的数据,所有 3 行都将被锁定以在另一个表单中进行编辑。这告诉我页面级锁定仍处于启用状态。我根本没有代码或连接,只有一个本地文件。
    • 您无法使用相同的副本对此进行测试。您必须启动 Access 的第二个副本。如果您只运行一个副本 - 那么行锁定不会参与 - 因为您是同一个用户。再试一次,但启动访问 - 打开该数据库。现在启动访问的另一个副本(并打开相同的数据库) - 现在尝试 - 它会起作用。针对同一运行副本锁定系统不会使用行锁 - 它仍然作为页锁。 (对于不应该成为问题的单个用户)。您必须使用 2 个正在运行的访问副本进行测试,以了解其工作原理。这需要真正的第二个用户打开
    • 好的,在按照您的建议进行了几次尝试后,我已经拆分了数据库,将 BE 放在共享文件夹中,并将 FE 复制到我的和第二个用户的笔记本电脑上。这应该模拟正常的生产环境。结果让我有点困惑:如果我先打开 FE 的表单,行锁定会正确启动。如果第二个用户先打开 FE 的表单,行锁定不会生效。第二个用户还启用了“使用记录级锁定打开数据库”高级选项,FE 相同。知道是什么导致了这个问题吗?
    • 它应该可以工作。请记住,必须为每个表单设置锁定设置。因此,只要两种形式都设置为编辑记录锁定,那么这应该可以工作。用户需要在该共享文件夹中创建文件和删除文件的权限。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多