เหตุใดแบบสอบถามนี้ทำให้เกิดการหยุดชะงัก


11

เหตุใดแบบสอบถามนี้ทำให้เกิดการหยุดชะงัก

UPDATE TOP(1) system_Queue SET
  [StatusID] = 2,
  @ID = InternalID
WHERE InternalID IN (
    SELECT TOP 1 
      InternalID FROM system_Queue
    WHERE IsOutGoing = @IsOutGoing AND StatusID = 1
ORDER BY MessageID ASC, InternalID ASC)

เพิ่มกราฟการหยุดชะงัก:

<keylock hobtid="72057594236436480" dbid="9" objectname="Z.dbo.system_Queue" indexname="PK_system_Queue" id="lock5b25cc80" mode="X" associatedObjectId="72057594236436480">
    <owner-list>
     <owner id="processc6fe40" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc7b8e8" mode="S" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594405453824" dbid="9" objectname="Z.dbo.system_Queue" indexname="IX_system_Queue_DirectionByStatus" id="lock48cf3180" mode="S" associatedObjectId="72057594405453824">
    <owner-list>
     <owner id="processc7b8e8" mode="S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc6fe40" mode="X" requestType="wait"/>
    </waiter-list>
   </keylock>

เพิ่ม:

ขอบคุณSankarสำหรับบทความที่มีวิธีแก้ปัญหาการหยุดชะงักประเภทนี้:

  • กำจัดคอลัมน์ที่ไม่จำเป็นออกจากการฉายของผู้อ่านดังนั้นเขาไม่จำเป็นต้องค้นหาดัชนีคลัสเตอร์
  • เพิ่มคอลัมน์ที่ต้องการตามคอลัมน์ที่มีอยู่ในดัชนีที่ไม่ทำคลัสเตอร์เพื่อสร้างดัชนีครอบคลุมอีกครั้งเพื่อให้ผู้อ่านไม่ได้ค้นหาดัชนีคลัสเตอร์
  • หลีกเลี่ยงการอัพเดตที่ต้องรักษาดัชนีที่ไม่ทำคลัสเตอร์

คุณใช้แพลตฟอร์ม db เวอร์ชันใดอยู่? ระดับการแยก trx เริ่มต้น (หรือพร้อมกัน) คืออะไร ดัชนีใดมีอยู่ในตาราง system_Queue ในขณะนี้
SQLRockstar

@SQLRockstar เพิ่มกราฟ deadlock, sql server 2008
garik

@SQLRockstar IX_system_Queue_DirectionByStatus โดย IsOutGoing และ StatusID
garik

คำตอบ:


13

ดูเหมือนว่าฉันกำลังพยายามเลือก SELECT และ UPDATE ในคำสั่งเดียวกันและลงบนตารางเดียวกัน

SELECT กำลังถือล็อคที่ใช้ร่วมกันในค่าภายในดัชนี IX_system_Queue_DirectionByStatus และ UPDATE จำเป็นสำหรับการปลดล็อคเหล่านั้นก่อนที่จะได้รับการล็อคแบบเอกสิทธิ์ซึ่งจะอัปเดตคีย์หลัก (ซึ่งฉันจะเดาว่าเป็นคลัสเตอร์และเป็นส่วนหนึ่งของ IX_system_Queue_DirectionByStatus ค่าคีย์)

อย่างไรก็ตามฉันเดาว่าแบบสอบถามนี้จะประสบความสำเร็จในโอกาสที่หายากที่ค่าดัชนีที่เลือกและการปรับปรุงจะไม่ขัดแย้งกันเท่านั้น มันจะหยุดชะงักทุกครั้งที่คุณดำเนินการ (ฉันคิดว่ามันจะเป็น)

นี่คือลิงค์ที่อธิบายการหยุดชะงักในรายละเอียดเพิ่มเติม: http://sqlblog.com/blogs/jonathan_kehayias/archive/2008/07/30/the-anatomy-of-a-deadlock.aspx


บิงโก! ขอขอบคุณ. มันเป็นสถานการณ์ที่แปลกมากสำหรับการหยุดชะงักที่ฉันเคยเห็น ขอบคุณสำหรับคำตอบ.
garik

6

ฉันไม่คาดหวังให้คุณทำเครื่องหมายโพสต์นี้เป็นคำตอบ แต่แบ่งปันข้อมูลเพิ่มเติมโดยผู้เชี่ยวชาญ SQL Server คนอื่น ๆ ในหัวข้อนี้

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/01/01/reproducing-deadlocks-involving-only-one-table.aspx

http://rusanu.com/2009/05/16/readwrite-deadlock/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.