如何解决sql server检测到的死锁



我面临死锁问题,sql server检测到它并返回异常,因为它选择了一个进程作为牺牲品。我想避免这个问题,我试图将隔离级别更改为未提交,并添加索引,但这并没有解决问题,下面是描述死锁问题的报告:

<deadlock>
<victim-list>
<victimProcess id="process133b1e188" />
</victim-list>
<process-list>
<process id="process133b1e188" taskpriority="0" logused="5236" waitresource="RID: 18:1:3545:209" waittime="1939" ownerId="13564317" transactionname="implicit_transaction" lasttranstarted="2020-12-18T18:15:14.250" XDES="0x1a064a3a8" lockMode="U" schedulerid="2" kpid="23832" status="suspended" spid="71" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2020-12-18T18:15:14.280" lastbatchcompleted="2020-12-18T18:15:14.280" lastattention="1900-01-01T00:00:00.280" clientapp="jTDS" hostname="med" hostpid="123" loginname="med" isolationlevel="read uncommitted (1)" xactid="13564317" currentdb="18" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="462" stmtend="592" sqlhandle="0x030012003d326d4a3bf62b0195ac000001000000000000000000000000000000000000000000000000000000"> UPDATE DEP SET name WHERE id = 2    </frame>
</executionStack>
</process>
<process id="process133b1e558" taskpriority="0" logused="30956" waitresource="KEY: 18:72057766865403904 (8c1a6a11df48)" waittime="1957" ownerId="13563835" transactionname="implicit_transaction" lasttranstarted="2020-12-18T18:15:14.113" XDES="0x1a064b668" lockMode="S" schedulerid="2" kpid="32596" status="suspended" spid="68" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2020-12-18T18:15:14.263" lastbatchcompleted="2020-12-18T18:15:14.263" lastattention="1900-01-01T00:00:00.263" clientapp="jTDS" hostname="med" hostpid="123" loginname="med" isolationlevel="read committed (2)" xactid="13563835" currentdb="18" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="24" sqlhandle="0x0200000064dbc4257a329ecd9ef9f0056fe48ce548b17d2e0000000000000000000000000000000000000000">
SELECT * FROM Worker w WHERE (w.id =  @P0 )  </frame>
</executionStack>
</process>
</process-list>
<resource-list>
<ridlock fileid="1" pageid="3545" dbid="18" objectname="DEP" id="lock185869680" mode="X" associatedObjectId="72057766864551936">
<owner-list>
<owner id="process133b1e558" mode="X" />
</owner-list>
<waiter-list>
<waiter id="process133b1e188" mode="U" requestType="wait" />
</waiter-list>
</ridlock>
<keylock hobtid="72057766865403904" dbid="18" objectname="Worker" indexname="worker_id" id="lock17d9fdb80" mode="X" associatedObjectId="72057766865403904">
<owner-list>
<owner id="process133b1e188" mode="X" />
</owner-list>
<waiter-list>
<waiter id="process133b1e558" mode="S" requestType="wait" />
</waiter-list>
</keylock>
</resource-list>
</deadlock>

尝试阅读关于:

set deadlock priority high

对于不想成为受害者的会话,您应该使用high或10。

我想说,隔离级别读取未提交不是一个好的选择。

最新更新