SQL Server 中的自死锁



在事务中运行的安装过程中,我突然收到以下错误:

事务(进程 ID 61(在与另一个进程的锁资源上死锁,并被选为死锁受害者。重新运行事务。

这很奇怪,因为没有其他会话访问数据库。我还关闭了服务器上的并行性。这发生在运行 Sql Server Developer 2017 的开发机器上:

死锁图如下所示:

<deadlock-list>
<deadlock victim="process23c22077088">
<process-list>
<process id="process23c22077088" taskpriority="0" logused="0" waitresource="METADATA: database_id = 40 SCHEMA(schema_id = 16), lockPartitionId = 0" waittime="3489" ownerId="19528332" transactionname="GetInitializedIMA" lasttranstarted="2019-09-30T18:40:58.847" XDES="0x23b6850fac0" lockMode="Sch-S" schedulerid="12" kpid="17636" status="suspended" spid="53" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2019-09-30T18:40:58.783" lastbatchcompleted="2019-09-30T18:40:58.783" lastattention="2019-09-30T18:36:47.943" clientapp=".Net SqlClient Data Provider" hostname="RND68" hostpid="29660" loginname="S-1-9-3-2459696885-1204846140-3013888703-3157444644" isolationlevel="read committed (2)" xactid="19528330" currentdb="40" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="unknown" line="129" stmtstart="-1" sqlhandle="0x03002800205b3c6bdde23301d8aa000001000000000000000000000000000000000000000000000000000000">
unknown     </frame>
<frame procname="adhoc" line="1" stmtend="104" sqlhandle="0x01002800f50e5536807d84d63b02000000000000000000000000000000000000000000000000000000000000">
EXEC SoftadminMapQBIntegration.QueryModel_SyncWithMa     </frame>
</executionStack>
<inputbuf>
EXEC SoftadminMapQBIntegration.QueryModel_SyncWithMap
EXEC SoftadminMapQB.CacheDatabaseNames
</inputbuf>
</process>
</process-list>
<resource-list>
<metadatalock subresource="SCHEMA" classid="schema_id = 16" dbid="40" lockPartition="0" id="lock23bb4ee9b00" mode="Sch-M">
<owner-list>
<owner id="process23c22077088" mode="Sch-M"/>
<owner id="process23c22077088" mode="Sch-S" requestType="wait"/>
</owner-list>
<waiter-list>
<waiter id="process23c22077088" mode="Sch-S" requestType="wait"/>
</waiter-list>
</metadatalock>
</resource-list>
</deadlock>
</deadlock-list>

错误始终发生在同一位置。客户端是一个使用 SqlClient 运行一系列 sql 批处理的 .NET 应用程序。

我已经将错误追踪到在事务期间创建的视图。当对此视图的引用出现在以后的批处理中时,会发生此错误。我可以通过删除其定义中的连接来修改视图以使死锁消失(FK 上的常规连接等于 PK(。

以前有没有人见过这样的事情或知道发生了什么?

完整版信息:

Microsoft SQL Server 2017 (RTM-GDR) (KB4505224) - 14.0.2027.2 (X64) Jun 15 2019 00:26:19 
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 17763:) (Hypervisor)

我在开发机器上遇到了一个非常相似的问题,我有一个几天前运行良好的脚本,现在我每次都遇到死锁......作为你,我在一个事务(使用 SQL 客户端执行脚本的 .NET 应用程序(中,没有建立其他连接。 我的设置中唯一的更改是几个小时前将我的实例从 2017 年迁移到 2019 年。我设法通过将目标数据库的兼容模式从 2017 (140( 升级到 2019 (150( 并且不再死锁来解决此问题!

希望这有帮助。

我面临着完全相同的问题。我有一个带有一些varchar列的表值参数,例如

create type tt_my_type as table
(
guid                       varchar(250) not null,
name                       varchar(250)
primary key (guid)
)

但是,在我的应用程序中,我将值传递给长度超过 250 个字符的name,这导致了死锁。当我在重新评估数据后增加varchar长度时,流程死锁消失了。

最新更新