.net 在SQL Server中插入挂起

.net 在SQL Server中插入挂起,.net,sql-server,entity-framework,.net,Sql Server,Entity Framework,添加新表单在长时间超时后偶尔崩溃。表单收集了大量数据,在保存时,它会进行一些处理,然后插入许多记录 我们可以在我们的测试实例上相当容易地重现这一点,但还不能找出原因。最后,使用Stackify Prefix这一非常好的免费工具,我们发现系统在一个简单的、一个记录插入上阻塞了两次,每次都是相同的。它处于挂起状态300秒,然后事务中止 下面是有问题的查询,第一个是使用Show me what running查询从SQLServer提取的,第二个是从Stackify Prefix提取的。我不确定如何在

添加新表单在长时间超时后偶尔崩溃。表单收集了大量数据,在保存时,它会进行一些处理,然后插入许多记录

我们可以在我们的测试实例上相当容易地重现这一点,但还不能找出原因。最后,使用Stackify Prefix这一非常好的免费工具,我们发现系统在一个简单的、一个记录插入上阻塞了两次,每次都是相同的。它处于挂起状态300秒,然后事务中止

下面是有问题的查询,第一个是使用Show me what running查询从SQLServer提取的,第二个是从Stackify Prefix提取的。我不确定如何在不安装调试模式打开的构建的情况下获取数据值,但我不确定是否在测试实例上更新构建,以防干扰帮助我们至少有时重现bug的任何东西

我正在寻找任何关于如何进一步调试的建议。查询的执行计划很简单,它在主键上只有一个索引,没有触发器或约束。这个问题发生在多个实例上,所以我不怀疑数据库损坏。基本上,我想知道是否有一种方法可以找出是什么导致这个查询处于挂起状态达300秒。多谢各位

(@0 int,@1 decimal(10,3),@2 datetime2(7),@3 int,@4 int)
INSERT [dbo].[Deliveries]([OrderId], [DeliveredQuantity], [DeliveryDate], [Notes], [Status], [ReturnedQuantity], [ReturnedDate], [ReturnedReason], [ReceivedQuantity], [ReceivedDate], [ReceivedByUserId], [ApprovedByUserId], [ApprovedDate], [DeliveredId], [IsDeleted])
VALUES (@0, @1, @2, NULL, @3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @4, NULL)
    SELECT [Id]
    FROM [dbo].[Deliveries]
    WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()

INSERT [dbo].[Deliveries]
           ([OrderId],[DeliveredQuantity],[DeliveryDate],[Notes],[Status],[ReturnedQuantity],[ReturnedDate],[ReturnedReason],[ReceivedQuantity],[ReceivedDate],[ReceivedByUserId],[ApprovedByUserId],[ApprovedDate],[DeliveredId],[IsDeleted])
VALUES (1250 /* @0 */,'Unsupported Type' /* @1 */,'Error parsing date' /* @2 */,NULL,2 /* @3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,26859 /* @4 */,NULL)

以下DMV可帮助您进一步调查

SELECT Start_Time [Request Started], [Status],blocking_session_id [Blocked by], wait_type [Process Waiting for],
wait_resource [Waiting on]
FROM sys.dm_exec_requests where session_id=## 

SELECT * FROM sys.dm_tran_locks where request_session_id=## 

SELECT * FROM sys.dm_os_waiting_tasks where session_id = ## 

替换为正在运行插入的会话

尝试使用此查询找出会话等待SELECT*FROM sys.dm\U exec\U请求的原因,其中会话id=SELECT*FROM sys.dm\U tran\U locks where request\U session\U id=SELECT*FROM sys.dm\U os\U waiting\U TASKES where\U id=ReplacerunAnd,最好在变量中获取标识值并使用它DECLARE@Id INT INSERT。。。。。。。。设置@Id=@@IDENTITY@SQLServerBuddy:我建议使用SCOPE_IDENTITY,而不是像@IDENTITY这样的任何东西来获取新插入的标识值。对我同意你的看法this@SQLServerBuddy我能够再次重现这个问题,并使用请求会话ID运行了3次选择,所有3条记录都返回了数据。因此,这将帮助我们进一步调试。我相信你已经回答了我提出的问题,这是为了提供下一步。你能提供答案让我选择吗?非常感谢!