我正面临一个问题,我通过私有软件安装创建新数据库时无法解决.
链接到追踪死锁XML File here的跟踪的XML文件
当我尝试更改db owner时,我能够跟踪导致死锁的原因.
声明:EXEC [ISC_RAS_CD_APP] .dbo.sp_changedbowner @loginame = N’sa’,@ map = false
<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,所以我不知道我是否可以更改它.
我在线查看每一个答案,但没有什么可以帮助我,任何人都知道我能做些什么来解决它?
如果需要,可以提供更多信息.
问候
最佳答案 这是一个奇怪的图表.会话处于死锁状态,等待会话拥有的资源.
您提供的Profiler跟踪不仅仅是死锁图.
基于此,我可以在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
我假设HkHostCkptEnableDisable中的Hk(死锁图中的事务名称)引用了“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无论如何调用它,但添加了一个导致问题的额外检查点(如果我使用下面的代码并且取消注释检查点行,我也会遇到死锁).
BEGIN TRANSACTION
alter authorization on database::[FOO] to [sa]
--checkpoint
COMMIT
检查点似乎导致读取master.sys.sysdbreg中的同一行,该行由先前在同一会话中的alter authorization独占锁定(sid列更新为属于此数据库的行的0x01)和检查点事务无法获取授予用户事务的锁.