2014-04-14 63 views
0

我想通過查看t-sql跟蹤來理清死鎖,但我正在努力理解這些信息。我這裏有信息的彙總,然後在帖子的末尾全死鎖跟蹤:如何解釋一個t-sql死鎖跟蹤

第一把鎖是一種叫做dbo.RetailVoucher
第二鎖是一種叫做ooc.PlannedUniversalVoucher

表的表

第一個存儲過程讀取下表:
dbo.RetailVoucher,ooc.PlannedOrderItem和ooc.PlannedOrder。

第2存儲過程讀取以下表格:
ooc.PlannedBatch & ooc.PlannedUniversalVoucher

現在,在等待對方的程序,我以爲他們會都必須讀取相同的表在某一點。我顯然不明白如何解釋蹤跡。我是否需要在其他程序中追蹤dbo.RetailerVoucher和ooc.PlannedUniversalVoucher上的鎖的來源?

謝謝。

下面是完整的跟蹤:

<deadlock-list> 
<deadlock victim="process894748"> 
    <process-list> 
    <process id="process894748" taskpriority="0" logused="3064" waitresource="KEY: 8:72057594084655104 (845afc30a382)" waittime="944" ownerId="12987790066" transactionname="user_transaction" lasttranstarted="2014-04-10T19:07:02.250" XDES="0x803d53c0" lockMode="S" schedulerid="3" kpid="14356" status="suspended" spid="67" sbid="0" ecid="0" priority="0" trancount="3" lastbatchstarted="2014-04-10T19:07:02.287" lastbatchcompleted="2014-04-10T19:07:02.287" clientapp=".Net SqlClient Data Provider" hostname="ID13115" hostpid="4872" loginname="UVUser" isolationlevel="read committed (2)" xactid="12987790066" currentdb="8" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056"> 
    <executionStack> 
    <frame procname="UVSystem.ooc.PlannedPacketPreserveEVouchers" line="144" stmtstart="12286" stmtend="13618" sqlhandle="0x0300080039a18c7fa2ed9800dda200000100000000000000"> 
update dbo.RetailVoucher 
      set QuantityInStock -= rvsum.QuantitySum 
      from dbo.RetailVoucher urv 
      join (
       select oib.id, SUM(oib.Quantity) as QuantitySum 
       from (
        select coalesce(rv.RelatedVoucherId, rv.Id) id, oi.Quantity 
        from 
         ooc.PlannedOrderItem oi 
         join ooc.PlannedOrder po on oi.PlannedOrderId = po.Id 
         join RetailVoucher rv on oi.RetailVoucherId = rv.Id 
        where po.PlannedPacketId = @PlannedPacketId 
         and oi.PartnerId is null 
         and oi.OnDmenadServiceId is null 
         and rv.VoucherTypeId = 1 
       ) oib 
       group by oib.Id 
      ) rvsum 
      on urv.Id = rvsum.id; 

     </frame> 
    </executionStack> 
    <inputbuf> 
Proc [Database Id = 8 Object Id = 2139922745] </inputbuf> 
    </process> 
    <process id="processd0db8088" taskpriority="0" logused="10716" waitresource="PAGE: 8:1:778990" waittime="1078" ownerId="12987783115" transactionname="user_transaction" lasttranstarted="2014-04-10T19:07:01.473" XDES="0x144975950" lockMode="S" schedulerid="7" kpid="11172" status="suspended" spid="61" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2014-04-10T19:07:01.473" lastbatchcompleted="2014-04-10T19:07:01.473" clientapp=".Net SqlClient Data Provider" hostname="ID13115" hostpid="12168" loginname="UVUser" isolationlevel="read committed (2)" xactid="12987783115" currentdb="8" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056"> 
    <executionStack> 
    <frame procname="UVSystem.ooc.OfflineOrdersImportPacket" line="294" stmtstart="23548" stmtend="24026" sqlhandle="0x030008006d6796551b829700dda200000100000000000000"> 
update ooc.PlannedBatch 
    set 
     IsCompleted = @True 
    from ooc.PlannedBatch pb 
     join ooc.PlannedUniversalVoucher puv on puv.PlannedBatchId = pb.Id 
     left outer join @DuplicatedVouchers dv on dv.Id = puv.Id 
    where dv.Id is null;  </frame> 
    </executionStack> 
    <inputbuf> 
Proc [Database Id = 8 Object Id = 1435920237] </inputbuf> 
    </process> 
    </process-list> 
    <resource-list> 
    <keylock hobtid="72057594084655104" dbid="8" objectname="UVSystem.dbo.RetailVoucher" indexname="PK_RetailVoucher" id="lock10ccbd180" mode="X" associatedObjectId="72057594084655104"> 
    <owner-list> 
    <owner id="processd0db8088" mode="X"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="process894748" mode="S" requestType="wait"/> 
    </waiter-list> 
    </keylock> 
    <pagelock fileid="1" pageid="778990" dbid="8" objectname="UVSystem.ooc.PlannedUniversalVoucher" id="lock15ba81480" mode="IX" associatedObjectId="72057594113425408"> 
    <owner-list> 
    <owner id="process894748" mode="IX"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="processd0db8088" mode="S" requestType="wait"/> 
    </waiter-list> 
    </pagelock> 
    </resource-list> 
</deadlock> 
</deadlock-list> 

回答

3

讓我試試。

您有tho進程,processd0db8088和process894748。從執行堆棧中,您可以看到process894748正在執行PlannedPacketPreserveEVouchers,而processd0db8088正在執行OfflineOrdersImportPacket。您也可以在這裏看到有關這兩個進程的問題。

從資源列表中可以找到這兩個進程死鎖的資源。第一個是RetailVoucher表中PK_RetailVoucher索引中的特定索引行:processd0db8088專門鎖定了它,並且進程process894748正在等待獲得共享鎖。另一個資源是屬於PlannedUniversalVoucher表的數據頁面778990,由進程process894748保存,而processd0db8088正在等待獲得對其的讀取訪問權限。

鎖可能從交易開始的任何地方進行。此處顯示在執行堆棧中的查詢是等待資源的查詢,而不是鎖定的查詢。檢查整個執行軌跡以找出實際鎖定的位置。

標準建議適用:縮短交易,按順序訪問表,索引合適。