我们使用MS Access作为我们系统之一的GUI,但我们遇到了一个问题,即Access在底层表或行上持有锁,这会阻止SQL Server对此数据运行任何更新查询。这是有问题的,因为虽然我们的Access前端只需要对此数据的只读访问,但我们有适当的系统定期刷新数据。由于Access已经锁定数据,这些刷新操作失败(或无限延迟)。
通过打开Access前端并使用sys.dm_tran_locks DMV显示数据锁定来说明此问题。我重现问题的步骤是:
当用户点击以在前端显示单个记录时,会出现第二个问题。当屏幕上显示单个记录时,SQL Server DMV会显示以下锁定:3x对象,1x密钥,1x页面。密钥是共享锁,其他是意图共享。同样,命令状态暂停,等待类型为ASYNC_NETWORK_IO。只要用户正在查看记录,就会保留这些锁
我们需要停止访问以无限期地持有这些锁。不幸的是,MS Access不属于我的技能组合,因此我不知道需要做些什么来解决这个问题。
答案 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是一个基于文件的产品,而不是生产就绪的产品。适用于电话簿或食谱,这就是所有。也没有缩放。