Pertanyaan Penyebab proses menjadi korban deadlock


Saya memiliki proses dengan Select yang membutuhkan waktu lama untuk diselesaikan, pada urutan 5 hingga 10 menit.
Saat ini saya tidak menggunakan NOLOCK sebagai petunjuk untuk mesin database MS SQL.
Pada saat yang sama kami memiliki proses lain untuk melakukan pembaruan dan menyisipkan ke dalam database dan tabel yang sama.
 Proses pertama telah dimulai, baru-baru ini berakhir sebelum waktunya dengan sebuah pesan

SQLEXCEPTION: Transaksi telah menemui jalan buntu pada sumber daya kunci dengan proses lain dan telah dipilih sebagai korban deadlock.

Proses pertama ini berjalan di situs lain dalam kondisi yang identik tetapi dengan database yang lebih kecil dan dengan demikian pernyataan pilih yang dipertanyakan membutuhkan waktu yang lebih singkat (pada urutan 30 detik atau lebih). Di situs lain ini, saya tidak mendapatkan pesan kebuntuan di situs lain ini. Saya juga tidak mendapatkan pesan ini di situs yang memiliki masalah pada awalnya, tetapi, saya berasumsi, karena database telah berkembang, saya percaya saya harus melewati beberapa ambang. Inilah pertanyaan saya:

  1. Mungkinkah waktu yang dibutuhkan untuk transaksi untuk melaksanakan membuat proses terkait lebih cenderung ditandai sebagai korban deadlock.
  2. Jika saya mengeksekusi pilihan dengan petunjuk NOLOCK, apakah ini akan menghapus masalah?
  3. Saya menduga bahwa bidang datetime yang dicentang sebagai bagian dari klausa WHERE dalam pernyataan pilih menyebabkan waktu pencarian lambat. Bisakah saya membuat indeks berdasarkan bidang ini? Apakah itu dianjurkan?

76
2017-12-05 18:52


asal


Jawaban:


Q1: Dapatkah waktu yang diperlukan untuk transaksi untuk dijalankan membuat proses terkait lebih cenderung ditandai sebagai korban deadlock.

Tidak. SELECT adalah korban karena hanya membaca data, karena itu transaksi telah dilakukan biaya lebih rendah terkait dengannya sehingga dipilih sebagai korban:

Secara default, Mesin Database memilih sebagai korban deadlock   sesi menjalankan transaksi itu paling murah untuk memutar kembali.   Atau, pengguna dapat menentukan prioritas sesi dalam   deadlock menggunakan situasi SET DEADLOCK_PRIORITY pernyataan.   DEADLOCK_PRIORITY dapat disetel ke RENDAH, NORMAL, atau TINGGI, atau alternatif   dapat disetel ke nilai bilangan bulat apa pun dalam rentang (-10 hingga 10).

Q2. Jika saya mengeksekusi pilihan dengan petunjuk NOLOCK, apakah ini akan menghapus masalah?

Tidak. Karena beberapa alasan:

Q3. Saya menduga bahwa bidang datetime yang dicentang sebagai bagian dari klausa WHERE dalam pernyataan pilih menyebabkan waktu pencarian lambat. Bisakah saya membuat indeks berdasarkan bidang ini? Apakah itu dianjurkan?

Mungkin. Penyebab kebuntuan hampir sangat mungkin menjadi basis data yang terindeks buruk. 10 menit pertanyaan dapat diterima dalam kondisi yang begitu sempit, yang saya yakin 100% dalam kasus Anda adalah tidak diterima.

Dengan 99% keyakinan saya menyatakan bahwa kebuntuan Anda dikungkung oleh pemindaian tabel besar yang bertentangan dengan pembaruan. Mulailah dengan menangkap grafik kebuntuan untuk menganalisa penyebabnya. Anda kemungkinan besar harus mengoptimalkan skema database Anda. Sebelum Anda melakukan modifikasi apa pun, baca topik ini Merancang Indeks dan sub-artikelnya.


96
2017-12-05 19:13



Di sini adalah bagaimana masalah kebuntuan ini benar-benar terjadi dan bagaimana itu benar-benar diselesaikan. Ini adalah database yang cukup aktif dengan 130 ribu transaksi yang terjadi setiap hari. Indeks dalam tabel dalam database ini awalnya dikelompokkan. Klien meminta kami untuk membuat indeks tidak tercakup. Segera setelah kami melakukannya, jalan buntu dimulai. Ketika kami membangun kembali indeks-indeks itu sebagai cluster, deadlocking berhenti.


9
2017-12-14 22:54



Jawaban di sini patut dicoba, tetapi Anda juga harus meninjau kode Anda. Secara khusus membaca jawaban Polyfun di sini: Bagaimana cara menghilangkan kebuntuan dalam aplikasi SQL Server 2005 dan C #?

Ini menjelaskan masalah konkurensi, dan bagaimana penggunaan "dengan (updlock)" dalam pertanyaan Anda mungkin memperbaiki situasi kebuntuan Anda - tergantung benar-benar pada persis apa yang dilakukan kode Anda. Jika kode Anda mengikuti pola ini, kemungkinan ini lebih baik untuk memperbaiki, sebelum beralih ke bacaan kotor, dll.


2
2017-09-28 05:14