我们使用 MS Access 作为我们的一个系统的 GUI,但我们遇到了一个问题,即 Access 持有基础表或行的锁,这会阻止 SQL Server 对此数据运行任何更新查询。这是有问题的,因为虽然我们的访问前端只需要对此数据的只读访问,但我们拥有定期刷新数据的系统。由于 Access 已持有数据锁定,这些刷新操作会失败(或无限期延迟)。
通过打开 Access 前端并使用 sys.dm_tran_locks DMV 显示数据锁定来说明此问题。我重现该问题所采取的步骤是:
- 打开访问前端。这显示了一个包含数千条记录的可滚动表单
- 使用 SQL Server DMV 显示数据锁定。这显示了 5 个“对象”类型锁,请求模式为“IS”(意向共享)。使用 sys.dm_exec_requests 显示命令状态为“挂起”,等待类型为“ASYNC_NETWORK_IO”。只要用户打开 Access 前端,这些锁就会一直保持,并防止对所涉及的表进行任何更新/删除/截断操作。现在如果用户滚动到最后Access 中的记录集的锁被释放!
当用户单击以在前端显示单个记录时,会出现第二个问题。当屏幕上显示单个记录时,SQL Server DMV 显示这些锁:3x 对象、1x 密钥、1x 页面。密钥是共享锁,其他的是意图共享。同样,命令状态已暂停,等待类型为 ASYNC_NETWORK_IO。只要用户正在查看记录,这些锁就会一直保持
我们需要阻止访问无限期地持有这些锁。不幸的是,MS Access 不属于我的技能范围,所以我不知道需要做什么来解决这个问题。
这个问题我没有解决,但是有同事解决了。我们所做的是,不是创建到 SQL Server 表的链接表,而是创建到视图的链接表。视图看起来像这样:
CREATE VIEW dbo.acc_tblMyTable
AS
SELECT * FROM tblMyTable WITH (NOLOCK)
没有锁定,并且作为奖励,Access 将数据视为只读。
确保你明白当你使用时会发生什么NOLOCK, 然而。
不幸的是,MS Access 不属于我的技能范围,所以我不知道需要做什么来解决这个问题。
摆脱访问:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)