gpt4 book ai didi

SQL Server 事务 (ID) 死锁

转载 作者:行者123 更新时间:2023-12-03 03:40:47 25 4
gpt4 key购买 nike

通过私有(private)软件安装创建新数据库时,我遇到了无法解决的问题。

Deadlock error image

链接到跟踪死锁 XML File here 的 XML 文件

当我尝试更改数据库所有者时,我能够跟踪导致死锁的原因。

语句:EXEC [ISC_RAS_CD_APP].dbo.sp_changedbowner @loginame = N'sa', @map = false

enter image description here

<deadlock-list>
<deadlock
victim="process4efa404e8">
<process-list>
<process
id="process4efa404e8"
taskpriority="0"
logused="0"
waitresource="KEY: 1:281474978545664 (11ea04af99f6)"
waittime="4947"
ownerId="1284191"
transactionname="HkHostCkptEnableDisable"
lasttranstarted="2017-02-23T12:51:54.617"
XDES="0x4ff1e5be0"
lockMode="S"
schedulerid="4"
kpid="10252"
status="suspended"
spid="62"
sbid="0"
ecid="0"
priority="0"
trancount="1"
lastbatchstarted="2017-02-23T12:51:54.610"
lastbatchcompleted="2017-02-23T12:51:54.610"
lastattention="2017-02-23T12:51:54.580"
clientapp="SQL Management"
hostname="IDQSRV01"
hostpid="8940"
loginname="HMS\OrenG"
isolationlevel="read committed (2)"
xactid="1284156"
currentdb="12"
lockTimeout="4294967295"
clientoption1="673185824"
clientoption2="128056">
<executionStack>
<frame
procname="mssqlsystemresource.sys.sp_changedbowner"
line="26"
stmtstart="1656"
stmtend="1686"
sqlhandle="0x0300ff7f12d71ceed5d2350180a4000001000000000000000000000000000000000000000000000000000000">
checkpoint </frame>
<frame
procname="adhoc"
line="1"
sqlhandle="0x01000c0069b98f048084f3000500000000000000000000000000000000000000000000000000000000000000">
EXEC [ISC_RAS_CD_APP].dbo.sp_changedbowner @loginame = N'sa', @map = false </frame>
</executionStack>
<inputbuf>
EXEC [ISC_RAS_CD_APP].dbo.sp_changedbowner @loginame = N'sa', @map = false </inputbuf>
</process>
</process-list>
<resource-list>
<keylock
hobtid="281474978545664"
dbid="1"
objectname="master.sys.sysdbreg"
indexname="clst"
id="lock5006efc00"
mode="X"
associatedObjectId="281474978545664">
<owner-list>
<owner
id="process4efa404e8"
mode="X" />
<owner
id="process4efa404e8"
mode="S"
requestType="wait" />
</owner-list>
<waiter-list>
<waiter
id="process4efa404e8"
mode="S"
requestType="wait" />
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>

“sa”是我在安装新服务器时创建的默认用户。

我的任务优先级设置为 0,但每次它都会给我一个不同的任务 ID,所以我不确定是否可以更改它。

我在网上查看了每个答案,但没有任何帮助,有人知道我可以做什么来解决它吗?

如果需要,可以提供更多信息。

问候

最佳答案

这是一个奇怪的图表。 session 在等待 session 自身拥有的资源时陷入死锁。

您提供了探查器跟踪,而不仅仅是死锁图。

基于此,我可以在 2014 年重现该问题,但不能在 2012 年或 2016 年重现该问题。

在我测试过的所有 2014 年实例上重现该问题的代码(构建如下)

  • (SP1-CU9-GDR) (KB3194722) - 12.0.4487.0 (X64)
  • (SP2) (KB3171021) - 12.0.5000.0 (X64))
  • Microsoft SQL Server 2014 (SP2-CU4) (KB4010394) - 12.0.5540.0 (X64)

 

IF db_id('FOO') IS NOT NULL
BEGIN
print 'dropping db'
use master
alter database [FOO] set single_user with rollback immediate
drop database [FOO]
END

go

CREATE DATABASE [FOO]
go

BEGIN TRANSACTION
use [FOO]
EXEC [FOO].dbo.sp_changedbowner @loginame = N'sa', @map = false
COMMIT

我假设 HkHkHostCkptEnableDisable (死锁图中的事务名称)指的是“Hekaton”,因此这可能是 2014 年为支持内存 OLTP 进行一些代码更改而引入的问题。

如果我摆脱显式事务,问题就会消失。因此,一种方法是释放正在争用的锁。

或者您也可以按照 sp_changedbowner 弃用通知中的建议进行操作

This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Use ALTER AUTHORIZATION instead.

sp_changedbowner无论如何都会调用它,但会添加一个额外的 checkpoint这会导致问题(如果我使用下面的代码且未注释检查点行,我也会遇到死锁)。

BEGIN TRANSACTION
alter authorization on database::[FOO] to [sa]
--checkpoint
COMMIT

检查点似乎导致读取 master.sys.sysdbreg 中的同一行由 alter authorization 独家锁定在之前的同一 session 中(属于此数据库的行的 sid 列更新为 0x01),并且检查点事务无法获取授予用户事务的锁。

关于SQL Server 事务 (ID) 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42411010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com