Anda perlu menyelidiki ini di sisi server untuk memahami mengapa waktu eksekusi habis. Perhatikan bahwa server tidak memiliki batas waktu, batas waktu disebabkan oleh default 30 detik pada SqlCommand.CommandTimeout
.
Sumber yang bagus adalah Menunggu dan Mengantre , yang merupakan metodologi untuk mendiagnosis kemacetan kinerja dengan SQL Server. Berdasarkan penyebab sebenarnya dari timeout, tindakan yang tepat dapat diambil. Anda harus terlebih dahulu menentukan apakah Anda berurusan dengan eksekusi yang lambat (rencana yang buruk) atau pemblokiran.
Jika saya berani menebak, saya akan mengatakan bahwa pola IF EXISTS... UPDATE
yang tidak sehat adalah akar penyebabnya. Pola ini salah dan akan menyebabkan kegagalan di bawah konkurensi. Dua transaksi bersamaan yang mengeksekusi IF EXISTS
secara bersamaan keduanya akan mencapai kesimpulan yang sama dan keduanya coba INSERT
atau UPDATE
. Bergantung pada batasan yang ada dalam database, Anda dapat berakhir dengan kebuntuan (kasus keberuntungan) atau dengan penulisan yang hilang (kasus sial). Namun, hanya penyelidikan yang tepat yang akan mengungkapkan akar penyebab sebenarnya. Bisa jadi sesuatu yang sama sekali berbeda, seperti peristiwa pertumbuhan otomatis
.
Prosedur Anda juga salah menangani blok CATCH. Anda harus selalu periksa XACT_STATE()
karena transaksi mungkin sudah dibatalkan pada saat blok CATCH Anda berjalan. Juga tidak jelas apa yang Anda harapkan dari penamaan transaksi, ini adalah kesalahan umum yang saya lihat sering dikaitkan dengan transaksi bernama membingungkan dengan savepoints. Untuk pola yang benar, lihat Penanganan Pengecualian dan Transaksi Bertingkat .
Sunting
Berikut adalah cara yang mungkin untuk menyelidiki ini:
- Ubah
CommandTimeout
ke 0 (mis. tak terbatas). - Aktifkan
blocked process threshold
, setel ke 30 detik (sebelumnya CommandTimeout) - Pantau di Profiler untuk Aktivitas Laporan Proses yang Diblokir
- Mulai beban kerja Anda
- Lihat apakah Profiler menghasilkan peristiwa laporan apa pun. Jika ya, mereka akan menemukan penyebabnya.
Tindakan ini akan menyebabkan peristiwa 'laporan proses yang diblokir' setiap kali Anda mendapatkan batas waktu, jika batas waktu itu disebabkan oleh pemblokiran. Aplikasi Anda akan terus menunggu hingga pemblokiran dihapus, jika pemblokiran disebabkan oleh live-lock maka itu akan menunggu selamanya.