【发布时间】:2020-12-04 09:04:54
【问题描述】:
我正在尝试解决 SQL 死锁问题。以下是系统健康报告
<deadlock>
<victim-list>
<victimProcess id="process87d03ccf8" />
</victim-list>
<process-list>
<process id="process87d03ccf8" taskpriority="0" logused="0" waitresource="KEY: 7:72057901332627456 (f323ae9efc53)" waittime="1087" ownerId="20788909869" transactionname="SELECT" lasttranstarted="2020-12-03T23:13:56.500" XDES="0x338706d10" lockMode="S" schedulerid="6" kpid="38240" status="suspended" spid="103" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2020-12-03T23:13:56.490" lastbatchcompleted="2020-12-03T23:13:56.490" lastattention="1900-01-01T00:00:00.490" clientapp=".Net SqlClient Data Provider" hostname="ID45846" hostpid="58020" loginname="ubuser" isolationlevel="read committed (2)" xactid="20788909869" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="x.dbo.OrderData_GetByOrderID" line="6" stmtstart="124" sqlhandle="0x03000700cddb7412e6afdc00a0a9000001000000000000000000000000000000000000000000000000000000"></frame>
</executionStack>
<inputbuf>
Proc [Database Id = 7 Object Id = 309648333] </inputbuf>
</process>
<process id="process32f127868" taskpriority="0" logused="112" waitresource="KEY: 7:72057901332692992 (004616e83cc3)" waittime="1087" ownerId="20788909868" transactionname="UPDATE" lasttranstarted="2020-12-03T23:13:56.500" XDES="0x81bad63a8" lockMode="X" schedulerid="15" kpid="66292" status="suspended" spid="61" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2020-12-03T23:13:56.490" lastbatchcompleted="2020-12-03T23:13:56.490" lastattention="1900-01-01T00:00:00.490" clientapp=".Net SqlClient Data Provider" hostname="ID45846" hostpid="58020" loginname="ubuser" isolationlevel="read committed (2)" xactid="20788909868" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="x.dbo.OrderData_Set" line="36" stmtstart="1662" sqlhandle="0x030007002608c15b50af010156ac000001000000000000000000000000000000000000000000000000000000"></frame>
</executionStack>
<inputbuf>
Proc [Database Id = 7 Object Id = 1539377190] </inputbuf>
</process>
</process-list>
<resource-list>
<keylock hobtid="72057901332627456" dbid="7" objectname="unidbmaster.dbo.OrderData" indexname="PK_OrderData" id="lock494546200" mode="X" associatedObjectId="72057901332627456">
<owner-list>
<owner id="process32f127868" mode="X" />
</owner-list>
<waiter-list>
<waiter id="process87d03ccf8" mode="S" requestType="wait" />
</waiter-list>
</keylock>
<keylock hobtid="72057901332692992" dbid="7" objectname="unidbmaster.dbo.OrderData" indexname="IX_OrderData_Currency_ParcelData_GrandTotal_CustomsValue" id="lock73ecc1b80" mode="S" associatedObjectId="72057901332692992">
<owner-list>
<owner id="process87d03ccf8" mode="S" />
</owner-list>
<waiter-list>
<waiter id="process32f127868" mode="X" requestType="wait" />
</waiter-list>
</keylock>
</resource-list>
</deadlock>
基于此正确的是:
- Update 进程锁定了 PK_OrderData,而 Select 进程想要它?
- Select 进程锁定了 IX_OrderData_Currency_ParcelData_GrandTotal_CustomsValue 并且 Update 进程想要它?
- Select 进程正在选择 Update 进程要更新的同一行
我假设解决此问题的一种方法是删除 IX_OrderData_Currency_ParcelData_GrandTotal_CustomsValue 索引,但它在其他地方使用。
所以我的问题是,有什么方法可以解决这个问题?我知道我可以在 Select 语句中添加一个指令,说“脏数据没问题”,但是感觉不对……
【问题讨论】:
-
更新是什么样的?
-
RCSI 开启了吗?如果没有,那可能是一个解决方案....
-
@Mitch - 但需要注意 RCSI 也可能有自己的问题。
-
@seanb:是的,这是真的。但这不是咨询演出,所以只是对 OP 将进一步调查的假设提出建议。
标签: sql sql-server database-deadlocks