我们使用 MS Access 作为我们其中一个系统的 GUI,但我们遇到了一个问题,即 Access 会锁定基础表或行,这会阻止 SQL 服务器对此数据运行任何更新查询。这是有问题的,因为虽然我们的 Access 前端只需要对这些数据进行只读访问,但我们有系统会定期刷新数据。由于 Access 已对数据持有锁定,这些刷新操作会失败(或无限期延迟)。
通过打开 Access 前端并使用 sys.dm_tran_locks DMV 显示数据锁定来说明此问题。我为重现该问题所采取的步骤是:
- 打开访问前端。这显示了一个包含数千条记录的可滚动表单
- 使用 SQL Server DMV 显示数据锁定。这显示了请求模式为“IS”(意图共享)的 5 个“对象”类型锁。使用 sys.dm_exec_requests 将命令状态显示为“暂停”,等待类型显示为“ASYNC_NETWORK_IO”。只要用户打开 Access 前端,这些锁就会被持有,并防止对所涉及的表进行任何更新/删除/截断操作。现在,如果用户滚动到Access 中记录集的末尾,锁就会被释放!
第二个问题发生在用户单击以在前端显示单个记录时。当屏幕上显示单个记录时,SQL 服务器 DMV 会显示这些锁:3x 对象、1x 键、1x 页面。钥匙是共享锁,其他是意图共享的。同样,命令状态为挂起,等待类型为 ASYNC_NETWORK_IO。只要用户正在查看记录,这些锁就会被持有
我们需要阻止访问无限期地持有这些锁。不幸的是 MS Access 不是我技能的一部分,所以我不知道需要做什么来解决这个问题。