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

Tre*_*ent 4 sql-server ms-access

我们使用MS Access作为我们其中一个系统的GUI,但是我们遇到了Access在底层表或行上持有锁的问题,这会阻止SQL服务器对此数据运行任何更新查询.这是有问题的,因为虽然我们的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中记录集的末尾,则会释放锁定!

当用户点击以在前端显示单个记录时,会出现第二个问题.当屏幕上显示单个记录时,SQL Server DMV会显示以下锁定:3x对象,1x密钥,1x页面.密钥是共享锁,其他是意图共享.同样,命令状态暂停,等待类型为ASYNC_NETWORK_IO.只要用户正在查看记录,就会保留这些锁

我们需要在无限期的基础上停止访问这些锁.不幸的是,MS Access不属于我的技能组合,因此我不知道需要做些什么来解决这个问题.

ta.*_*.is 5

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

CREATE VIEW dbo.acc_tblMyTable
AS
  SELECT * FROM tblMyTable WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)

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

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

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

摆脱Access :)