MS Access无限期地保存对表行的锁定

时间:2012-08-19 11:44:09

标签: sql-server ms-access

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

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

  1. 打开Access前端。这显示了一个包含数千条记录的可滚动表单
  2. 使用SQL Server DMV显示数据锁定。这显示了5个“对象”类型的锁,其请求模式为“IS”(Intent共享)。使用sys.dm_exec_requests将命令状态显示为“已挂起”,将等待类型显示为“ASYNC_NETWORK_IO”。只要用户打开Access前端,就会保留这些锁,并阻止对所涉及的表执行任何更新/删除/截断操作。现在,如果用户滚动到Access中记录集的末尾,则会释放锁定!
  3. 当用户点击以在前端显示单个记录时,会出现第二个问题。当屏幕上显示单个记录时,SQL Server DMV会显示以下锁定:3x对象,1x密钥,1x页面。密钥是共享锁,其他是意图共享。同样,命令状态暂停,等待类型为ASYNC_NETWORK_IO。只要用户正在查看记录,就会保留这些锁

    我们需要停止访问以无限期地持有这些锁。不幸的是,MS Access不属于我的技能组合,因此我不知道需要做些什么来解决这个问题。

2 个答案:

答案 0 :(得分:5)

我没有解决这个问题,但是一位同事做了。所做的是,他没有创建到SQL Server表的链接表,而是创建了链接表到视图。观点看起来像这样:

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

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

但请确保您理解what can happen when you use NOLOCK

  

不幸的是,MS Access不属于我的技能组合,所以我不知道需要做些什么来解决这个问题。

摆脱Access:)

答案 1 :(得分:-2)

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

这是Access的问题。由于曾几何时它有一个内部数据库,它完全控制它继续认为这是什么,行为是它认为是正确的。实际上,它最终运行SQL Server来执行它认为正确的操作。这不是一件好事,因为Access是一个基于文件的产品,而不是生产就绪的产品。适用于电话簿或食谱,这就是所有。也没有缩放。