Deadlock Dari Kunci pada Tabel Sementara Yang Sama Dalam Proses Yang Berbeda

17

Saya telah menemukan jalan buntu yang tampaknya menunjukkan sesuatu yang saya pikir tidak mungkin. Ada dua proses yang terlibat dalam kebuntuan:

1. process8cf948 SPID 63

  • Melakukan ALTER TABLE pada tabel sementara #PB_Cost_Excp_Process_Invoices_Work.

  • Memiliki kunci IX di atas meja #PB_Cost_Excp_Process_Invoices_Work dengan ID objek 455743580

2. process4cb3708 SPID 72

  • Berperforma dalam UPDATE di tabel sementara #PB_Cost_Excp_Process_Invoices_Work yang seharusnya merupakan salinan tabelnya sendiri yang unik.

  • Memiliki kunci Sch-M di #PB_Cost_Excp_Process_Invoices_Work dengan ID objek yang sama 455743580 !

Ini seharusnya tidak mungkin. Apakah saya melewatkan sesuatu? Apakah tabel #T Sementara benar-benar digunakan kembali di antara kedua SPID ini?

Ini pada SQL Server 2008 R2 Paket Layanan 2 dengan Pembaruan Kumulatif 1 (versi 10.50.4260).

Jejak kebuntuan yang tidak berubah lengkap ada di bawah. Perhatikan bagaimana kedua proses beroperasi pada ID objek yang sama dengan nama tabel yang sama # 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

MEMPERBARUI

Mesin tersebut menunjukkan 16 prosesor di Task Manager dan Device Manager, jadi kunci partisi diaktifkan, dan dua kunci ada di partisi kunci yang berbeda. Saya tidak tahu apakah kunci partisi adalah penyebab di sini atau tidak.

Saya juga menemukan posting yang menarik ini di blog CSS SQL Server Engineers .

PEMBARUAN 2

Tabel sementara dijatuhkan pada akhir setiap prosedur tersimpan. Mereka dibuat dengan pola buat #tabel, ubah skema, masukkan, perbarui, pilih, lalu lepas. Ada beberapa titik masuk ke prosedur umum yang menggunakan temp #table ini, jadi kami memiliki proc pusat yang mengatur kolom yang diperlukan untuk memanggil proc umum. Jika tidak, kita harus meniru definisi tabel yang sama di semua procs titik masuk.

Proses ini sering diminta dari beberapa aplikasi klien. Beberapa aplikasi klien menyebut proses ini dari banyak utas. Yang lain menjalankannya satu per satu. Pikirkan perangkat lunak inventaris / akuntansi di mana kantor pusat memproses data untuk ribuan toko secara paralel sementara toko juga menjalankan proses yang sama sendiri. Jadi, jika ini adalah masalah yang jarang terjadi ketika partisi kunci diaktifkan, itu tidak akan menjadi sangat jarang terjadi pada basis data pelanggan kami yang lebih besar.

UPDATE 3 - 2012-12-19

Pelanggan lain mengalami masalah yang sama pada SQL Server 2012 build 11.0.2100. Saya tidak melihat penyebutan perbaikan untuk masalah ini dalam deskripsi pembaruan kumulatif. Meneliti

PEMBARUAN 4 - 2013-02-13

Microsoft telah merilis perbaikan untuk bug ini dalam pembaruan berikut:

Paul Williams
sumber
@AaronBertrand: Tidak, kami tidak ingin caching tabel #temp. Itu akan cukup buruk pada koneksi yang sama - apalagi digunakan kembali antara proses. Saya tidak punya file .xdl, hanya informasi jejak flag 1222.
Paul Williams
Kami secara eksplisit menjatuhkan tabel #temp ini setelah selesai.
Paul Williams
2
Saya masih menyarankan mengambil dan memposting file .xdl di suatu tempat sehingga orang lain dapat melihat lebih dekat - itu akan memiliki detail yang jauh lebih baik.
Aaron Bertrand
2
Saya dapat mengonfirmasi bahwa partisi kunci terlibat di sini. Posting ini memiliki beberapa detail tentang menganalisis kebuntuan yang melibatkan dan karena mengunci partisi. bit.ly/Ruzmym bit.ly/W7yuRK Tapi saya tidak tahu mengapa kedua sesi memposting ObjectID yang sama.
Roji P Thomas
@SQLKiwi Terima kasih telah melihat masalah ini! Saya tidak berpikir tentang hashing sumber daya kunci. Mengingat itu ada pada ID objek, saya menduga itu tidak terjadi, tapi saya hanya menebak. Pelanggan telah melaporkan kebuntuan kepada kami selama beberapa hari. Saya hanya memiliki kebuntuan pelacakan 1 hari, tapi saya yakin ini adalah kebuntuan yang mereka alami. Kami membuka tiket dukungan dengan Microsoft untuk membantu kami mengetahuinya. Saya akan memperbarui pertanyaan ini karena saya belajar lebih banyak.
Paul Williams

Jawaban:

4

Kami telah membuka kasus dengan Microsoft terkait masalah ini. Microsoft mengonfirmasi bahwa bug ini juga mempengaruhi SQL Server 2012. Mereka berencana untuk merilis perbaikan di SQL Server 2012 Paket Layanan 2 (tidak dirilis pada saat saya menulis jawaban ini).

Sampai Microsoft merilis paket layanan ini, pengguna SQL Server 2012 dapat mem-bypass masalah dengan menonaktifkan partisi kunci melalui jejak jejak 1229 .

Perhatikan bahwa masalah ini hanya berlaku untuk mesin yang memiliki 16 prosesor atau lebih.

Informasi lebih lanjut tentang partisi kunci

Terima kasih atas dukungan Microsoft! Mereka sangat cepat dan membantu.

MEMPERBARUI

Bug diperbaiki di SQL Server 2012 Pembaruan Kumulatif 2 Untuk SQL Server 2012 SP 1 .

Paul Williams
sumber