การหยุดชะงักจากการล็อคบนตารางชั่วคราวเดียวกันในกระบวนการที่แตกต่างกัน


17

ฉันได้พบการหยุดชะงักที่ดูเหมือนจะแสดงสิ่งที่ฉันคิดว่าเป็นไปไม่ได้ มีสองกระบวนการที่เกี่ยวข้องในการหยุดชะงัก:

1. กระบวนการ 8cf948 SPID 63

  • ดำเนินการ ALTER TABLE บนตารางชั่วคราว #PB_Cost_Excp_Process_Invoices_Work

  • เป็นเจ้าของล็อค IX บนโต๊ะ #PB_Cost_Excp_Process_Invoices_Work ด้วย ID วัตถุ 455743580

2. กระบวนการ 4cb3708 SPID 72

  • ดำเนินการใน UPDATE บนตารางชั่วคราว #PB_Cost_Excp_Process_Invoices_Work ซึ่งควรจะเป็นสำเนาเฉพาะของตาราง

  • เป็นเจ้าของล็อค Sch-M ใน #PB_Cost_Excp_Process_Invoices_Work ด้วย ID วัตถุเดียวกัน 455743580 !

นี่น่าจะเป็นไปไม่ได้ ฉันพลาดอะไรไปรึเปล่า? #Temporary ตารางได้รับการใช้ซ้ำระหว่าง SPID ทั้งสองนี้จริง ๆ หรือไม่

นี่คือบน SQL Server 2008 R2 Service Pack 2 พร้อมกับการปรับปรุงที่สะสม 1 (รุ่น 10.50.4260)

การติดตามการหยุดชะงักแบบไม่เปลี่ยนแปลงที่สมบูรณ์อยู่ด้านล่าง โปรดสังเกตว่ากระบวนการทั้งสองนั้นทำงานบน ID วัตถุเดียวกันด้วยชื่อตารางเดียวกัน # PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519:

12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait
12/14/2012 13:46:03,spid23s,Unknown,waiter-list
12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M
12/14/2012 13:46:03,spid23s,Unknown,owner-list
12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580
12/14/2012 13:46:03,spid23s,Unknown,waiter id=process4cb3708 mode=Sch-M requestType=wait
12/14/2012 13:46:03,spid23s,Unknown,waiter-list
12/14/2012 13:46:03,spid23s,Unknown,owner id=process8cf948 mode=IX
12/14/2012 13:46:03,spid23s,Unknown,owner-list
12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=3 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock3139b4780 mode=IX associatedObjectId=455743580
12/14/2012 13:46:03,spid23s,Unknown,resource-list
12/14/2012 13:46:03,spid23s,Unknown,Proc [Database Id = 8 Object Id = 1857974987]
12/14/2012 13:46:03,spid23s,Unknown,inputbuf
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Submit_SP @SiteKey, @PWDate
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.DR_SubmitPaperwork_SP line=174 stmtstart=12912 stmtend=13018 sqlhandle=0x03000800cb72be6e500434018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Create_SP

    -- Clean up work table
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Submit_SP line=138 stmtstart=11890 stmtend=12012 sqlhandle=0x03000800428c1f1950f833018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,UPDATE #PB_Cost_Excp_Process_Invoices_Work
    SET PBCEPrcInv_RtlPkg_Item_Quantity = RtlPkg_Item_Quantity
    FROM #PB_Cost_Excp_Process_Invoices_Work
        INNER JOIN Item_Packages (NOLOCK)
            ON PBCEPrcInv_ItemPkg_Key = ItemPkg_Key
        INNER JOIN Retail_Packages (NOLOCK)
            ON ItemPkg_RtlPkg_Key = RtlPkg_Key

    -- Lookup pricebook cost
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Create_SP line=25 stmtstart=2394 stmtend=3050 sqlhandle=0x030008003a082846321f46018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,executionStack
12/14/2012 13:46:03,spid23s,Unknown,process id=process8cf948 taskpriority=0 logused=0 waitresource=OBJECT: 2:455743580:0  waittime=3739 ownerId=707053534 transactionname=UPDATE lasttranstarted=2012-12-14T13:45:59.327 XDES=0x3c4502930 lockMode=X schedulerid=4 kpid=7276 status=suspended spid=72 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2012-12-14T13:45:58.337 lastbatchcompleted=2012-12-14T13:45:58.337 clientapp=PDI WCF Services - pdidb01-PDIMaster.cfg hostname=PDIWEB01 hostpid=2084 loginname=pdiuser isolationlevel=read committed (2) xactid=707053534 currentdb=8 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128568
12/14/2012 13:46:03,spid23s,Unknown,Proc [Database Id = 8 Object Id = 1857974987]
12/14/2012 13:46:03,spid23s,Unknown,inputbuf
12/14/2012 13:46:03,spid23s,Unknown,EXEC PB_ProcessExc_Costs_Submit_SP @SiteKey, @PWDate
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.DR_SubmitPaperwork_SP line=174 stmtstart=12912 stmtend=13018 sqlhandle=0x03000800cb72be6e500434018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,EXEC dbo.PB_ProcessExc_Costs_CreateInvoiceWorkTable_SP
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_Submit_SP line=58 stmtstart=5782 stmtend=5894 sqlhandle=0x03000800428c1f1950f833018da000000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,ALTER TABLE #PB_Cost_Excp_Process_Invoices_Work DROP COLUMN PBCEPrcInv_Filler
12/14/2012 13:46:03,spid23s,Unknown,frame procname=PDICompany_218_01.dbo.PB_ProcessExc_Costs_CreateInvoiceWorkTable_SP line=50 stmtstart=5382 stmtend=5538 sqlhandle=0x0300080025d75a14ffff4701969f00000100000000000000
12/14/2012 13:46:03,spid23s,Unknown,executionStack
12/14/2012 13:46:03,spid23s,Unknown,process id=process4cb3708 taskpriority=0 logused=0 waitresource=OBJECT: 2:455743580:3  waittime=3739 ownerId=707052778 transactionname=ALTER TABLE lasttranstarted=2012-12-14T13:45:58.517 XDES=0x5f48bce80 lockMode=Sch-M schedulerid=6 kpid=7212 status=suspended spid=63 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2012-12-14T13:45:58.513 lastbatchcompleted=2012-12-14T13:45:58.513 clientapp=PDI WCF Services - pdidb01-PDIMaster.cfg hostname=PDIWEB01 hostpid=2084 loginname=pdiuser isolationlevel=read committed (2) xactid=707052778 currentdb=2 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128568
12/14/2012 13:46:03,spid23s,Unknown,process-list
12/14/2012 13:46:03,spid23s,Unknown,deadlock victim=process4cb3708
12/14/2012 13:46:03,spid23s,Unknown,deadlock-list

UPDATE

เครื่องที่มีปัญหาแสดงตัวประมวลผล 16 ตัวในตัวจัดการงานและตัวจัดการอุปกรณ์ดังนั้นการแบ่งพาร์ติชั่นล็อคจึงเปิดใช้งานและล็อคสองอันอยู่ในพาร์ติชั่นล็อคที่แตกต่างกัน ฉันไม่ทราบว่าการแบ่งพาร์ติชั่นล็อคเป็นสาเหตุที่นี่หรือไม่

ฉันยังพบนี้โพสต์ที่น่าสนใจในบล็อก CSS SQL Server วิศวกร

อัพเดท 2

ตารางชั่วคราวจะถูกดร็อปในตอนท้ายของทุกโพรซีเดอร์ที่เก็บไว้ พวกเขาจะถูกสร้างขึ้นด้วยรูปแบบการสร้าง #table แก้ไข schema, แทรก, ปรับปรุง, เลือกและจากนั้นลดลง มีจุดเข้าใช้หลายจุดสำหรับโพรซีเดอร์ทั่วไปที่ใช้ temp #table นี้ดังนั้นเราจึงมี proc ส่วนกลางที่ตั้งค่าคอลัมน์ที่จำเป็นในการเรียกโปรซีทั่วไป มิฉะนั้นเราจะต้องทำซ้ำข้อกำหนด #table เดียวกันใน procs จุดเริ่มต้นทั้งหมด

กระบวนการนี้ถูกเรียกใช้บ่อยครั้งจากหลายแอปพลิเคชันไคลเอนต์ แอปพลิเคชันไคลเอนต์บางตัวเรียกกระบวนการนี้จากหลายเธรด คนอื่น ๆ เรียกใช้มันทีละคน คิดว่าซอฟต์แวร์บัญชี / สินค้าคงคลังที่สำนักงานที่บ้านกำลังประมวลผลข้อมูลสำหรับร้านค้าหลายพันร้านค้าขนานกันในขณะที่ร้านค้านั้นดำเนินกระบวนการเดียวกันด้วยตนเอง ดังนั้นหากนี่เป็นปัญหาที่หายากเมื่อเปิดใช้งานการแบ่งพาร์ติชันล็อคจะไม่เกิดขึ้นได้ยากในฐานข้อมูลลูกค้าขนาดใหญ่ของเรา

อัปเดต 3 - 2012-12-19

ลูกค้ารายอื่นกำลังประสบปัญหาเดียวกันกับ SQL Server 2012 build 11.0.2100 ฉันไม่เห็นพูดถึงการแก้ไขสำหรับปัญหานี้ในคำอธิบายการปรับปรุงที่สะสม การวิจัย

อัปเดต 4 - 2013-02-13

Microsoft ได้เผยแพร่การแก้ไขสำหรับข้อบกพร่องนี้ในการปรับปรุงต่อไปนี้:


@AaronBertrand: ไม่เราไม่ต้องการแคช #temp table นั่นจะไม่ดีพอในการเชื่อมต่อเดียวกัน - มีการใช้ซ้ำระหว่างกระบวนการน้อยกว่ามาก ฉันไม่มีไฟล์. xdl เพียงแค่ข้อมูลสถานะการสืบค้นกลับ 1222
พอลวิลเลียมส์

เรากำลังวางตาราง #temp เหล่านี้อย่างชัดเจนเมื่อดำเนินการกับพวกเขา
พอลวิลเลียมส์

2
ฉันยังคงแนะนำให้จับและโพสต์ไฟล์. xdl ไว้ที่อื่นเพื่อให้คนอื่นดูได้ใกล้ขึ้น - มันจะมีรายละเอียดที่ดีกว่ามาก
Aaron Bertrand

2
ฉันสามารถยืนยันได้ว่ามีการแบ่งพาร์ติชันล็อคที่นี่ โพสต์เหล่านี้มีรายละเอียดบางอย่างเกี่ยวกับการวิเคราะห์การหยุดชะงักที่เกี่ยวข้องและเนื่องจากการล็อคพาร์ติชัน bit.ly/Ruzmym bit.ly/W7yuRK แต่ฉันไม่รู้ว่าทำไมทั้งสองเซสชันโพสต์ ObjectID เดียวกัน
Roji P Thomas

@SQLKiwi ขอบคุณที่ดูปัญหา! ฉันไม่ได้คิดถึงการล็อกทรัพยากรการล็อก เนื่องจากเป็นรหัสวัตถุฉันจึงสงสัยว่าไม่ใช่กรณีนี้ แต่ฉันแค่คาดเดา ลูกค้าได้รายงานการหยุดชะงักให้เราหลายวันแล้ว ฉันมีค่าการติดตามการหยุดชะงักเพียง 1 วันเท่านั้น แต่ฉันคิดว่านี่คือการหยุดชะงักที่พวกเขาประสบ เรากำลังเปิดตั๋วการสนับสนุนกับ Microsoft เพื่อช่วยให้เราเข้าใจได้ ฉันจะอัปเดตคำถามนี้เมื่อฉันเรียนรู้เพิ่มเติม
พอลวิลเลียมส์

คำตอบ:


15

4

เราได้เปิดเคสกับ Microsoft เกี่ยวกับปัญหานี้ Microsoft ยืนยันว่าจุดบกพร่องนี้มีผลกับ SQL Server 2012 พวกเขากำลังวางแผนที่จะปล่อยการแก้ไขใน SQL Server 2012 Service Pack 2 (ไม่ออกในเวลาที่ฉันเขียนคำตอบนี้)

จนกระทั่ง Microsoft releases Service Pack นี้ SQL Server 2012 ผู้ใช้สามารถหลีกเลี่ยงปัญหาโดยการปิดการแบ่งพาร์ทิชันล็อคผ่านร่องรอยธง 1229

โปรดทราบว่าปัญหานี้ใช้กับเครื่องที่มีโปรเซสเซอร์ 16 ตัวขึ้นไปเท่านั้น

ข้อมูลเพิ่มเติมเกี่ยวกับการแบ่งพาร์ติชั่นล็อค

ขอบคุณสำหรับการสนับสนุนของ Microsoft! พวกเขารวดเร็วและเป็นประโยชน์มาก

UPDATE

ข้อผิดพลาดการแก้ไขในSQL Server 2012 สะสมปรับปรุง 2 สำหรับ SQL Server 2012 SP 1

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