Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Terkadang Mendapatkan SqlException:Timeout kedaluwarsa

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:

  1. Ubah CommandTimeout ke 0 (mis. tak terbatas).
  2. Aktifkan blocked process threshold , setel ke 30 detik (sebelumnya CommandTimeout)
  3. Pantau di Profiler untuk Aktivitas Laporan Proses yang Diblokir
  4. Mulai beban kerja Anda
  5. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Ekspresi CASE di SQL Server

  2. Apa cara terbaik untuk menangani DBNull's

  3. Cara Memperbaiki "Daftar pilih untuk pernyataan INSERT berisi lebih sedikit item daripada daftar sisipan"

  4. Bagaimana Saya Dapat Mendeteksi dan Mengikat Perubahan Antara Nilai Baris dalam Tabel SQL?

  5. Cara Mengganti NULL dengan Nilai Lain di SQL Server – ISNULL()