MS Access 无限期地锁定表行

Posted

技术标签:

【中文标题】MS Access 无限期地锁定表行【英文标题】:MS Access holds locks on table rows indefinitely 【发布时间】:2012-08-19 11:44:08 【问题描述】:

我们使用 MS Access 作为其中一个系统的 GUI,但我们遇到了一个问题,即 Access 会锁定基础表或行,这会阻止 SQL Server 对此数据运行任何更新查询.这是有问题的,因为虽然我们的 Access 前端只需要对这些数据进行只读访问,但我们有系统会定期刷新数据。由于 Access 已经持有数据锁定,这些刷新操作失败(或无限期延迟)。

通过打开 Access 前端并使用 sys.dm_tran_locks DMV 显示数据锁定来说明此问题。我重现问题的步骤是:

    打开 Access 前端。这显示了一个包含数千条记录的可滚动表单 使用 SQL Server DMV 显示数据锁定。这显示了请求模式为“IS”(意图共享)的 5 个“对象”类型锁。使用 sys.dm_exec_requests 将命令状态显示为“暂停”,等待类型显示为“ASYNC_NETWORK_IO”。只要用户打开 Access 前端,这些锁就会被持有,并防止对所涉及的表进行任何更新/删除/截断操作。现在,如果用户在 Access 中滚动到记录集的末尾,锁就会被释放!

当用户单击以在前端显示单个记录时,会出现第二个问题。当屏幕上显示单个记录时,SQL 服务器 DMV 会显示这些锁:3x 对象、1x 键、1x 页面。钥匙是共享锁,其他是意图共享的。同样,命令状态为挂起,等待类型为 ASYNC_NETWORK_IO。只要用户正在查看记录,这些锁就会被持有

我们需要阻止访问无限期地持有这些锁。不幸的是,MS Access 不是我技能的一部分,所以我不知道需要做什么来解决这个问题。

【问题讨论】:

"打开 Access 前端。这显示了一个包含数千条记录的可滚动表单" 我认为无论您使用什么前端,这都会导致问题。如果您确实必须在连续形式或数据表中包含数千条记录,则可以考虑使用断开连接的记录集。 【参考方案1】:

我没有解决这个问题,但一位同事解决了。所做的是,他没有创建与 SQL Server 表的链接表,而是创建了与视图的链接表。视图如下所示:

CREATE VIEW dbo.acc_tblMyTable
AS
  SELECT * FROM tblMyTable WITH (NOLOCK)

没有锁定,作为奖励,Access 将数据视为只读。

不过,请确保您理解 what can happen when you use NOLOCK

很遗憾,MS Access 不是我技能的一部分,所以我不知道需要做什么来解决这个问题。

摆脱访问 :)

【讨论】:

NOLOCK 在这种情况下是不可行的,因为该文章中列出了一些缺点。从视图(或者可能是存储过程)中提取数据是否足以阻止 Access 获取持久锁?我不想取消所有锁 - 只需要 Access 在完成读取记录时表现出释放锁的合理行为。 你建议什么而不是 Access?如果问题没有被排序,那么它很可能发生在任何其他前端。您不妨建议摆脱 SQL Server :) @Trent 我不知道,我没有想法,抱歉。 FWIW,这对我和others 根本不起作用。后端:SQL Server 2008 R2 Express,前端:Access 2010。使用WITH (NOLOCK) 创建视图,并从 Access 链接它。链接视图不是只读的,当在 Access 中打开时,它会创建挂起的“ASYNC_NETWORK_IO”进程,就像打开表时一样。 @JimB 这对我们来说很好,我很惊讶其他人的报告它不起作用。我们仍然在使用它,但我们也超过了 Access,因此我们将这些查询转换为以 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 开头的 ODBC Passthrough。至于不准确的报告,您可以通过WITH (NOLOCK) 提出要求,但这取决于您系统中的并发量。【参考方案2】:

多年来一直在开发使用 SQL Server 作为后端的应用程序,主要是 .NET。从未遇到您正在讨论的锁定(阻塞)问题。一个设计合理的数据库应该使用 SQL Server 的默认行级更新锁定。

问题在于访问。因为从前它有一个内部数据库,它可以完全控制它,它继续认为这就是它所拥有的东西,并且行为就是它认为正确的东西。实际上,它已经结束运行 SQL Server 来做它认为正确的事情。这并不是一件好事,因为 Access 是一种基于文件的产品,而且还不是生产就绪的产品。适合电话簿或食谱,仅此而已。也不缩放。

【讨论】:

以上是关于MS Access 无限期地锁定表行的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 数据库被 Python 锁定

MS Access 直通选择查询导致 SQL Server 中的页面锁定

MS Access 子表单数据条目在插入 SQL 时被锁定

拆分 MS Access 数据库需要很长时间才能打开 - 后端不断锁定和解锁

OleDB 锁复制 .NET MS Access

MS Access 32 位或 64 位