Saya benar-benar mengalami kesulitan melacak beberapa pemblokiran yang kita alami.
Root blocking status SPID 'tidur', cmd adalah 'AWAITING COMMAND', dan sqltext
itu SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Ketika saya melihat transaksi teratas oleh laporan jumlah transaksi yang diblokir, pernyataan SQL yang diblokir adalah '-'.
Saya telah melakukan penelusuran pada SQL dan ketika pemblokiran terjadi, menelusuri SPID pemblokiran root tetapi belum benar-benar membawa saya ke mana pun. Pernyataan jejak terakhir sama dengan yang di sqltext
atas SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Saya telah memeriksa semua prosedur tersimpan terkait yang dapat saya temukan untuk memastikan mereka memiliki TRY / CATCH BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN pernyataan (kami menggunakan prosedur tersimpan untuk semuanya sehingga tidak ada pernyataan mandiri yang dijalankan). Masalah ini baru mulai terjadi selama 24 jam terakhir dan tidak ada yang mengklaim telah melakukan perubahan pada sistem.
Solusi: salah satu prosedur tersimpan kami yang jarang digunakan memiliki kesalahan dengan sisipan (jumlah kolom tidak cocok), tetapi kami masih bingung tentang apa yang sebenarnya terjadi.
Saat melihat semua informasi penelusuran, pernyataan EXEC untuk prosedur tersimpan ini terdaftar beberapa kali, tetapi TIDAK PERNAH tepat sebelum BLOK terjadi pada SPID pemblokiran. Tampaknya ketika mulai memblokir, jejak tidak mencatat eksekusi (atau pernyataan di dalamnya). Namun ada kalanya jejak itu merekam eksekusi itu dan tidak ada pemblokiran yang terjadi.
Laporan kesalahan prosedur tersimpan berasal dari pengguna, dan saya bisa menemukan beberapa pernyataan EXEC di jejak dan menjalankannya di SSMS. Tidak ada waktu ketika saya menjalankannya kita memiliki pemblokiran atau mereka menggantung. Mereka berlari seperti yang diharapkan (blok penahan menembak dan memutar kembali transaksi setelah kesalahan). Setelah menyelesaikan perbaikan prosedur tersimpan, kami belum melihat masalah lagi.
Jawaban:
Dari komentar, saya menduga Anda memiliki batas waktu Command sisi klien yang telah membatalkan kueri SQL. Ini tidak mengembalikan transaksi karena koneksi tetap terbuka di SQL Server karena koneksi pooling.
Jadi, Anda perlu menggunakan SET XACT_ABORT ON atau menambahkan beberapa kode kembalikan klien
Lihat Timeout Transaksi SQL Server untuk semua detail berdarah
sumber
Gunakan most_recent_sql_handle di sys.dm_exec_connections untuk melihat pernyataan terakhir yang dieksekusi.
Periksa juga apakah ada transaksi terbuka untuk spid itu
sumber
DBCC INPUTBUFFER(spid)
untuk melihat SQL terakhir dieksekusi.Sudahkah Anda mencoba menggunakan sp_whoisactive Adam Machanic ? Ada opsi untuk mendapatkan perintah luar untuk melihat apakah itu benar-benar ada dalam proc. Bisa jadi aplikasi tersebut menahan transaksi terbuka daripada melakukan itu. Coba lihat DBCC OPENTRAN juga.
sumber