Saya mencoba memecahkan masalah pemblokiran yang terjadi kurang dari sedetik. Aplikasi OLTP sangat sensitif dan harus memiliki waktu respons kurang dari 200 ms untuk beberapa transaksi sesuai SLA yang disepakati. Kami memiliki beberapa masalah eskalasi kunci dengan rilis kode baru yang dapat kami atasi dengan mengurangi ukuran batch dalam pembaruan. Bahkan dengan ukuran batch yang kecil, kami menduga bahwa sp baru memblokir baris yang sama dengan yang diperbarui oleh transaksi OLTP.
Saya perlu menemukan sesi yang diblokir dan sumber dayanya menunggu. Sesuai pemahaman saya, "ambang proses yang diblokir" dapat disetel minimal 1 detik sehingga tidak akan menangkap pemblokiran.
Saya bereksperimen dengan wait_info dan wait_completed x events.
Apakah ada cara lain untuk melacak ini? Terima kasih
Jawaban:
Karena Anda secara khusus tertarik untuk mengunci daripada menunggu secara umum,
locks_lock_waits
acara yang diperpanjang terdengar lebih cocok.Dengan filter aktif
increment >= 200
Di atas mengumpulkan pernyataan menunggu kunci untuk jumlah ambang waktu tetapi tidak memberikan sumber daya kunci spesifik.
Saya belum pernah menggunakan acara ini dan tidak memiliki wawasan tentang berapa banyak overhead sesi ini akan menyebabkan pada server produksi Anda.
Saya menemukan video ini pada topik. Itu sangat merekomendasikan penyaringan
counter
untuk mengurangi jumlah acara yang dikumpulkan dan saya telah melakukannya di atas.Itu juga menyebutkan perintah lama yang tidak terdokumentasi
Yang (jika jejak bendera 3605 diaktifkan) membuang informasi terbatas seperti di bawah ini ke log galat SQL Server.
Saya hanya menyebutkan ini secara sepintas karena acara yang diperluas jelas akan lebih disukai karena didokumentasikan dan jauh lebih kuat.
sumber
dbcc lock(StallReportThreshold, 200)
pertama dan itu mengeluarkan info setelah ambang melebihi selama jejak bendera 3605 diaktifkan. SQL Server tidak mengumpulkan info ini kalau-kalau Anda mungkin menjalankannya nanti.Jika Anda tertarik untuk mengunci, ada beberapa acara tambahan yang tersedia:
Dua peristiwa pertama memiliki
duration
kolom dalam (mikrodetik) yang dapat Anda filter untuk ambang Anda. Mereka juga memilikiresource_description
tindakan yang akan memberi Anda detail tentang sumber daya yang terlibat.The
lock_escalation
event juga memilikistatement
tindakan yang dapat Anda tambahkan untuk mengumpulkan pernyataan T-SQL yang memicu eskalasi kunci. Itu juga punyaescalation_cause
. Inilah sesi sampel:Saya menduga mungkin ada alasan Anda tidak dapat mengatur ambang laporan proses yang diblokir menjadi kurang dari satu detik: penguncian adalah sangat normal di RDBMS - mesin basis data harus mengunci sumber daya untuk melindungi mereka. Meskipun tidak ada definisi resmi tentang kapan penguncian menjadi memblokir, penguncian berdetak di atas detik, sepertinya agak normal bagi saya.
sumber