Farklı Süreçlerde Aynı Geçici Tablolardaki Kilitlerden Kilitlenmeler


17

İmkansız olduğunu düşündüğüm bir şeyi gösteren bir kilitlenme buldum. Kilitlenmeyle ilgili iki süreç vardır:

1. process8cf948 SPID 63

  • Geçici tablo #PB_Cost_Excp_Process_Invoices_Work üzerinde bir ALTER TABLE gerçekleştirme.

  • 455743580 nesne tanıtıcılı #PB_Cost_Excp_Process_Invoices_Work tablosundaki IX kilidine sahip

2. process4cb3708 SPID 72

  • Tablonun kendi benzersiz kopyası olması gereken geçici tablo #PB_Cost_Excp_Process_Invoices_Work üzerinde UPDATE içinde performans.

  • Aynı nesne kimliği 455743580 olan #PB_Cost_Excp_Process_Invoices_Work üzerinde Sch-M kilidine sahip !

Bunun imkansız olduğu varsayılıyor. Bir şey mi kaçırıyorum? # Geçici bir tablo bu iki SPID arasında gerçekten yeniden kullanıldı mı?

Bu, Toplu Güncelleştirme 1 (sürüm 10.50.4260) içeren SQL Server 2008 R2 Service Pack 2'de bulunur.

Değişmemiş tam kilitlenme izi aşağıdadır. İki işlemin de aynı tablo adıyla aynı nesne kimliğinde nasıl çalıştığını unutmayın # 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

GÜNCELLEME

Söz konusu makine Görev Yöneticisi ve Aygıt Yöneticisi'nde 16 işlemci gösteriyor, bu nedenle kilit bölümleme etkinleştirildi ve iki kilit farklı kilit bölümlerinde. Kilit bölümlemenin burada katkıda bulunan bir sebep olup olmadığını bilmiyorum.

Ayrıca bu ilginç yazı CSS SQL Server Engineers blogunda buldum .

GÜNCELLEME 2

Geçici tablolar, saklanan her yordamın sonunda bırakılır. Bunlar #table oluştur, şemayı değiştir, ekle, güncelle, seç ve sonra bırak deseni ile oluşturulur. Bu temp #table kullanan ortak bir yordama birden çok giriş noktası vardır, bu nedenle ortak proc çağırmak için gereken sütunları ayarlayan merkezi bir proc var. Aksi takdirde, tüm giriş noktası işlemlerinde aynı #table tanımını çoğaltmamız gerekir.

İşlem, birden çok istemci uygulamasından sık sık çağrılır. Bazı istemci uygulamaları bu işlemi birden çok iş parçacığından çağırır. Diğerleri bunu teker teker çalıştırıyor. Ev ofisinin binlerce mağaza için verileri paralel olarak işlediği envanter / muhasebe yazılımını düşünün, mağazalar da aynı işlemi kendileri çalıştırıyor. Bu nedenle, kilit bölümleme etkinleştirildiğinde nadir bir sorun varsa, daha büyük müşteri veritabanlarımızda bu kadar nadir olmayacaktır.

GÜNCELLEME 3 - 2012-12-19

Başka bir müşteri SQL Server 2012 11.0.2100 derlemesinde aynı sorunu yaşıyor. Toplu güncelleştirme açıklamalarında bu sorunla ilgili bir düzeltme görmedim. Araştırma.

GÜNCELLEME 4 - 2013-02-13

Microsoft bu hata için düzeltmeyi aşağıdaki güncelleştirmelerde yayımladı:


@AaronBertrand: Hayır, #temp tablo önbelleklemesi istemiyoruz. Aynı bağlantıda bu yeterince kötü olurdu - süreçler arasında çok daha az yeniden kullanılıyor. Bir .xdl dosyam yok, sadece izleme bayrağı 1222 bilgisi var.
Paul Williams

Onlarla işiniz bittiğinde bu #temp tablolarını açıkça bırakıyoruz.
Paul Williams

2
Yine de başkalarının daha yakından bakabilmesi için bir yerde .xdl dosyasını yakalamayı ve yayınlamayı öneriyorum - çok daha iyi ayrıntılara sahip olacak.
Aaron Bertrand

2
Burada kilit bölümlemenin yer aldığını doğrulayabilirim. Bu gönderiler kilit bölümleri içeren ve kilitlenme nedeniyle oluşan kilitlenmeleri analiz etme konusunda bazı ayrıntılara sahiptir. bit.ly/Ruzmym bit.ly/W7yuRK Ama her iki oturumun neden aynı ObjectID gönderdiğini bilmiyorum.
Roji P Thomas

@SQLKiwi Soruna baktığınız için teşekkür ederiz! Kilit kaynağı hashini düşünmedim. Bir nesne kimliğinde olduğu göz önüne alındığında, durumun böyle olduğundan şüpheleniyorum, ama sadece tahmin ediyorum. Müşteri bize birkaç gündür çıkmazlar bildiriyor. Sadece 1 günlük değerinde çıkmaz izleme var, ama eminim bu yaşadıkları çıkmazdır. Çözmemize yardımcı olmak için Microsoft ile bir destek bileti açıyoruz. Daha fazla bilgi edindikçe bu soruyu güncelleyeceğim.
Paul Williams

Yanıtlar:



4

Bu sorunla ilgili olarak Microsoft ile bir dava açtık. Microsoft, bu hatanın SQL Server 2012'yi de etkilediğini doğruladı. Düzeltmeyi SQL Server 2012 Service Pack 2'de yayınlamayı planlıyorlar (bu yanıtı yazarken yayınlanmadı).

Microsoft bu hizmet paketini yayımlayana kadar SQL Server 2012 kullanıcıları, kilit bölümlemeyi devre dışı bırakarak sorunu atlayabilir. izleme bayrağı 1229 .

Bu sorunun yalnızca 16 veya daha fazla işlemcisi olan makineler için geçerli olduğunu unutmayın.

Kilit bölümleme hakkında daha fazla bilgi

Microsoft desteğine teşekkür ederim! Onlar çok hızlı ve yararlı.

GÜNCELLEME

Hata, SQL Server 2012 SP 1 için SQL Server 2012 Toplu Güncelleştirme 2'de giderilmiştir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.