为什么“选择1来自 ” cause a LCK_M_IX on another process doing a DELETE

问题描述 投票:1回答:1

我有一张列出patient_clinic_visits的表格。我有SQL SERVER 2005后端。访问2010前端。

每天早晨,该表需要从医院主机的数据转储中刷新。

此数据转储包括前一天的信息(谁参加,未参加,取消)以及未来6周的预约。

因此,在进行一些处理之后,我在上传新数据之前,依次对来自Visit_Date>(一天)和<(一天+ 1)的Patient_clinic_visits进行“DELETE *”清理每天的表格。

在大多数日子里,每天只有大约100-150条记录。它们是Master_Patient_Table中Pat_ID的一个外键,它上面有NO_ACTION链。

此处删除查询在处理几天数据后在Access前端超时(即它在星期一,星期二,星期三都可以正常工作......)

我运行sp_whoisactive并得到:

00 01:53:01.926 52 [[查询SELECT 1 FROM“dbo”。“Patient_Clinic_Visits”]] RAHCC_User(265ms)ASYNC_NETWORK_IO 0 0 0 NULL 51 0 0 2暂停0 NULL SAH0020663 RAHCC_DB Microsoft MDB RAHCC 2013-04-02 09: 08:33.027 0 2013-04-02 11:01:35.033

00 00:00:27.610 53 [[查询 - 从Patient_Clinic_Visits DELERE clinic_date> = '26 -Mar-2013'DELECT_date <'27 -Mar-2013'DELinic_location ='MONC']删除] HAD \ jhogan05(27596ms) LCK_M_IX 16 0 0 52 1,074 0 0 130暂停2 NULL SAH0048645 RAHCC_DB Microsoft SQL Server Management Studio Express - 查询2013-04-02 11:01:07.343 0 2013-04-02 11:01:35.033

这表明我的客户端前端正在等待“来自Patient_Clinic_Vists的SELECT 1”并且这阻止了该过程。显然这是由于客户端上的ASYNC_NETWORK_IO(可能发生Access前端执行表请求然后不处理数据)。

a)然而,“来自Patient_Clinic_Visits的SELECT 1”实际上应该只返回TRUE或FALSE?这不太可能填补任何东西,并不清楚为什么会导致阻止情况?

b)我在Access前端的任何地方找不到“SELECT 1 ...”。这可能是SQLSERVER为响应更多文本选择而做出的一系列子选择的一部分吗?如果是这样,我如何在该过程历史中找到导致这种情况的真正选择?

干杯,

Johad

sql-server access-vba ms-access-2010 sp-who2
1个回答
1
投票

a)查询“来自Patient_Clinic_Visits的SELECT 1”将返回空结果集(如果Patient_Clinic_Visits表为空)或具有与Patients_Clinic_Visits表一样多行的结果集,每行中其中包含1。为此,SQL Server必须针对整个Patient_Clinic_Visits表发出查询,该表(假设默认锁定行为)将导致共享(读取)锁定成为该表中行的问题。

b)(注意:OP在评论中解决了这一点)我可能会遗漏一些东西,但是我没有看到你在哪里提出了基于sp_whosactive的“来自Patient_Clinic_Vists的SELECT 1”查询。理解从应用程序发送到数据库服务器的SQL的最佳方法可能是使用带有适当过滤器的SQL事件探查器(可能只过滤来自运行应用程序的主机的连接)。

© www.soinside.com 2019 - 2024. All rights reserved.