立即“锁定”在多用户环境下的访问记录

问题描述 投票:0回答:4

所以,记录锁定的访问是非常可怕的。我不能使用内置的记录锁定,因为它锁定了一个“页”的记录,而不仅仅是个人的记录(我试着改变使用记录级锁定的设置,但它仍然锁定一个页面,而不是只一个记录),但即使我能得到那个工作,它不会解决我的问题,因为记录不锁定直到用户开始制作形式的变化。

问题是,当两个人打开相同的记录,就可以开始进行更改,并保存两者(从而覆盖以前的变化)。更糟糕的是,有链接到其他表(键上的ID)和它们对这些表的更改然后如果他们都打开相同的记录自带之后的任何变化覆盖在窗体上列表框。

长话短说,我需要确保这是不可能的,两个人甚至在同一时间打开相同的记录(无论是否他们所做的任何修改,以它尚未)。

要做到这一点,我添加了一个字段,它表示如果记录已由用户锁定表。当他们打开一个形式,它在该领域,谁试图打开记录拿到它已经锁定的通知,其他用户将他们的名字。问题是,这种“锁”是不是瞬间。这需要其他用户几秒钟的“检测”,该记录被锁定,所以如果两个人试图打开相同的记录在大致相同的时间,就会让他们俩将其打开。我申请一个事务,设置锁的UPDATE语句,但仍留下了很短的窗口,其中,锁定不会“吃”两个人可以打开相同的记录。

那么,有没有一种方法,使一个UPDATE瞬间(因此所有其他用户立即看到它的结果),或者更好的是,一个强大的和全面的方式来锁定在访问多用户环境中的记录?

ms-access access-vba
4个回答
3
投票

这还不清楚为什么你只接收“页”锁定。

如果打开的文件 - >选项行锁定,那么你还需要设置的特定形式,以锁定当前记录。因此,只要打开记录锁不会帮你。该设置只规定了新形式的默认 - 它不是系统范围的设置。

如果你正确地打开锁定为一种形式,那么如果两个用户观看相同的记录,一个用户开始编辑记录,那么所有其他人不能编辑记录。任何其他用户试图编辑记录将看到在记录选择棒的“锁”图标(假定记录选择用于给定的形式接通)。他们还将收到“嘟嘟”声,如果他们尝试键入到给定的窗体上的任何编辑控制。

而当他们试图编辑,他们会看到这样的选择栏上可见的“锁”图标:

enter image description here

一些东西:

如果两个用户能够编辑记录,那么你不打开锁定为给定的形式。该功能必须通过基于表格形式进行设置。在文件 - >选项 - 更改设置>客户端设置只会为你创造新的形式默认!因此,设置只适用于默认的新形式 - 它不会改变现有的形式。

因此,设置记录锁定只是通过形式设置形式。

所以,你必须总是设置您要锁定到当前编辑的记录每个表单。设置此在形式设计,在属性表是这样的数据标签:

enter image description here

也请记住,记录级锁定(不同的设置和功能)的设置是接入客户端设置,不与给定的应用旅行。

如此以来,你的国家,两个用户可以编辑同一条记录,然后CLEARY你永远不打开记录锁定为给定的形式。该系统广泛的“默认”只记录锁定设置以上表格默认的(你不改变现有的这样的形式)。

下一步:[X]打开数据库使用记录级锁定的设置是接入客户端设置和不保存应用程序。所以这是一个访问范围的设置,而不是应用程序设置,也没有一个与应用程序传播。

所以,你必须设置这个每一个客户端工作站上,或者你必须设置这个在你的启动代码。

如果你不能去走一走,更改每个工作站更改此设置(或者您使用访问运行时),那么你可以使用这个VBA在你的启动代码来设置此功能:

  Application.SetOption "Use Row Level Locking", True

请注意,设置不生效,直到退出应用程序,但是这的确是一个“非”的问题,因为这意味着你运行该代码的第一时间,一些用户很可能是在页面锁定模式,和其他行锁定模式。大多数时候,这将导致小问题。

然而,下一次的任何用户启动应用程序,然后他们将在行锁定模式。

我在过去也写定制锁定代码。并且可以勾勒出如何使这项工作做得很好,但你贴什么到目前为止,你永远不打开或设置锁定亦未锁定为任何你现在反正形态正常工作。


1
投票

你可以使用下面介绍的方法:

Handle concurrent update conflicts in Access silently

处理您的锁场。


1
投票

好吧,我终于想通了所有的促成这一问题,并制定出一个解决方案。

问题是多方面的,所以我会分别覆盖问题:

第一个问题:我的自定义锁是不是瞬间。虽然我使用的是交易,有几秒钟后,一个锁被放置在用户仍然可以在同一时间访问相同的记录。我用CurrentDb.Execute来更新交易记录和工作区(0).BeginTrans。出于某种原因(尽管微软保证,从这里恰恰相反:https://msdn.microsoft.com/en-us/library/office/ff197654.aspx)的问题是,使用工作区对象的时候,交易不工作。当我切换到DBEngine.BeginTrans,锁是瞬间的,解决了我的迫在眉睫的问题。

具有讽刺意味的是,我几乎总是使用用到dbengine我的交易记录,但与工作区去这个时候没有理由,所以这是一个糟糕的举动明显。

第二个问题:我不得不使用定制锁定在首位的原因是因为预期(尽管被正确配置),记录级锁定不能正常工作。它仍然采用页级锁。这是由于我是从这里使用性能窍门:https://msdn.microsoft.com/en-us/library/dd942824%28v=office.12%29.aspx?f=255&MSPPError=-2147217396

诀窍需要打开到你的链接表包含在数据库中,从而加快了链接表操作的连接。问题是,OpenDatabase方法不使用记录级锁定兼容,所以它使用页级锁打开数据库,并且由于第一用户打开一个数据库来确定其锁定水平(这里说明:https://msdn.microsoft.com/en-us/library/aa189633(v=office.10).aspx),所有的后续连接被迫页面级。

第三个问题:我的问题是,我的形式并不只是简单的绑定形式,以一个单一的表。他们打开一条记录(不允许用户导航),并提供多种功能,允许用户进行影响其他表中的其他记录那些与他们正在编辑(通过组合框和弹出窗口的形式和什么记录修改不)。其结果是,我不能让两个人在同一时间打开相同的记录,因为它留下了太多的机会,为用户走了过来对方的变化。所以,即使我删除的openDatabase表现技巧,我还是不得不强迫的形式脏,尽快为他们立即打开它,因此记录锁并没有其他人可以打开它。我不知道这将是我的自锁瞬时且尚未测试的方面。

在任何情况下,我需要一个记录被锁定的用户打开它的瞬间,现在我决定用我的自定义锁(与修订的交易),以保持。如果别的东西来光,使得达不到理想的是,我可以尝试删除的openDatabase伎俩并切换到访问的内置锁定和打开时迫使每个记录即时锁。


0
投票

由于访问不作锁定记录很容易,我想知道,如果你要添加表锁定的记录条目是否会解决这个问题,即使这将是“胶带,汤罐头和衣架”的解决方案:你创建具有2个字段)被更新的记录ID,和b)的人的用户名更新该记录中的“Locked_Record”表。这一表格将控制谁拥有,因此可以编辑什么记录。你的形式将有一个搜索栏,当输入搜索词,“Enter”键按下的形式,将通过在数据寻找它,并在Locked_Record表寻找它搜索记录。如果Locked_Record表中找到,那么你的用户得到一个错误说“已经在使用记录”,并显示谁拥有记录。如果在数据未找到则显示适当的消息。如果找到了数据,并在Locked_Record表中找不到,那么Locked_Record条目将被创建,并且用户将在这里领取表格中显示的数据。在这一点上没有其他人可以编辑记录。当用户完成更新,无论是用户需要按下一个按钮,说:“做了更新”或形式将不得不被关闭。无论哪种方式的Locked_Record条目将被删除,以便其他人可以使用该记录。如果记录所有者不收出形式或不按按钮,然后就是训练的问题。这种方法可以是用户对多个实体,如客户,雇员,部门,等你只需要确保你的应用程序和数据库已建立,因此使用它可能会锁定其他表的任何子形式只会影响到该记录的条目其他表。

© www.soinside.com 2019 - 2024. All rights reserved.