7

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

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

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

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

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

4

2 回答 2

5

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

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

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

但是,请确保您了解使用 时会发生什么NOLOCK

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

摆脱访问 :)

于 2012-08-19T11:52:13.783 回答
-2

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

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

于 2014-07-08T17:02:14.693 回答