Mesin virtual ini meng-host database SharePoint 2007 (SP). Kami telah mengalami banyak deadlock SELECT / INSERT terhadap satu tabel yang banyak digunakan dalam basis data konten SP. Saya telah mempersempit sumber daya yang terlibat, kedua proses ini membutuhkan kunci pada indeks non-cluster.
INSERT memerlukan kunci IX pada sumber daya SELECT dan SELECT membutuhkan kunci S pada sumber daya INSERT. Grafik kebuntuan menggambarkan dan tiga sumber, 1.) dua dari SELECT (utas paralel produsen / konsumen), dan 2.) INSERT.
Saya telah melampirkan grafik kebuntuan untuk ulasan Anda. Karena ini adalah struktur kode dan tabel Microsoft, kami tidak dapat melakukan perubahan apa pun.
Namun, saya telah membaca, di situs MSFT SP, bahwa mereka merekomendasikan pengaturan opsi konfigurasi level Instance MAXDOP ke 1. Karena instance ini dibagikan di antara banyak database / aplikasi lain, pengaturan ini tidak dapat dinonaktifkan.
Oleh karena itu, saya memutuskan untuk mencoba dan mencegah pernyataan SELECT ini berjalan paralel. Saya tahu ini bukan solusi tetapi lebih merupakan modifikasi sementara untuk membantu mengatasi masalah. Oleh karena itu, saya meningkatkan "Ambang Biaya untuk Paralelisme" dari standar kami 25 menjadi 40 saat melakukannya, meskipun beban kerja tidak berubah (SELECT / INSERT sering terjadi) deadlock telah menghilang. Pertanyaan saya adalah mengapa?
SPID 356 INSERT memiliki kunci IX pada halaman milik indeks non-clustered
SPID 690 SELECT ID Eksekusi 0 memiliki kunci S pada halaman milik indeks non clustered yang sama
Sekarang
SPID 356 menginginkan kunci IX pada sumber daya SPID 690 tetapi tidak bisa mendapatkannya karena SPID 356 diblokir oleh SPID 690 ID Eksekusi 0 kunci S
SPID 690 ID Eksekusi 1 menginginkan kunci S pada sumber daya SPID 356 tetapi tidak dapat memperolehnya karena SPID 690 ID Eksekusi 1 diblokir oleh SPID 356 dan sekarang kita memiliki jalan buntu.
Rencana Eksekusi dapat ditemukan di SkyDrive saya
Detail Kebuntuan Lengkap dapat ditemukan di sini
Jika seseorang dapat membantu saya memahami mengapa saya sangat menghargainya.
EventReceivers Table.
Id uniqueidentifier no 16
Nama nvarchar no 512
SiteId uniqueidentifier no 16
WebId uniqueidentifier no 16
HostId uniqueidentifier no 16
HostType int no 4
ItemId int no 4
NamaDn no nvarchar no 512
LeafName nvarchar no 256
Tipe int no 4
SequenceNomor int no 4
Assembly nvarchar no 512
Class nvarchar no 512
Data nvarchar no 512
Filter nvarchar no 512
SourceId tContentTypeId no 512
SourceType int no 4
Kredensial int no 4
ContextType varbinary no 16
ContextEventType varbinary no 16
ContextId varbinary no 16
ContextObjectId varbinary no 16
ContextCollectionId varbinary no 16
nama_index index_description index_keys
EventReceivers_ByContextCollectionId nonclustered terletak di PRIMARY SiteID, ContextCollectionId
EventReceivers_ByContextObjectId nonclustered terletak di PRIMARY SiteID, ContextObjectId
EventReceivers_ById nonclustered, unik terletak di PRIMARY SiteID, Id
EventReceivers_ByTarget berkerumun, unik terletak di PRIMARY SiteID, WebId, hostid, HOSTTYPE, Jenis, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique, kunci unik, tidak bercacah, unik, terletak di PRIMARY Id
proc_InsertEventReceiver
danproc_InsertContextEventReceiver
melakukan itu kita tidak dapat melihat di XDL itu? Juga untuk mengurangi paralelisme mengapa tidak memengaruhi pernyataan ini secara langsung (menggunakan MAXDOP 1) alih-alih menggunakan pengaturan di seluruh server?