Bagaimana kebuntuan terdeteksi dan dilaporkan dalam RDBMS?

8

Saya diberi pertanyaan tipe esai ini selama wawancara tetapi tidak mendapatkan pekerjaan. Pertanyaan lengkapnya adalah sebagai berikut:

Bagaimana kebuntuan terdeteksi dan dilaporkan dalam RDBMS? Apa pemilik transaksi dan pengembang aplikasi yang bertanggung jawab untuk memastikan dalam skenario deteksi dan pencegahan?

Shadowcaz
sumber

Jawaban:

13

Di SQL Server ada utas terpisah yang secara berkala (default 5 detik, interval lebih rendah jika kebuntuan baru saja terdeteksi) memeriksa daftar tunggu untuk setiap siklus. Yaitu mengidentifikasi sumber yang ditunggu-tunggu oleh sebuah utas, kemudian ia menemukan pemilik sumber tersebut dan secara rekursif menemukan sumber daya mana yang pada gilirannya ditunggu-tunggu, sehingga mengidentifikasi utas-utas yang saling menunggu sumber daya lainnya.

Jika kebuntuan ditemukan maka seorang korban dipilih untuk dibunuh menggunakan algoritma ini:

  1. Identifikasi utas yang tidak dapat diraih (mis. Utas yang memutar kembali transaksi tidak bisa diraih).
  2. Temukan utas dengan prioritas deadlock terendah.
  3. Memilih salah satu yang termurah untuk memutar kembali, yaitu salah satu yang telah melakukan paling sedikit pekerjaan sejauh ini.

Anda dapat menemukan informasi lebih lanjut tentang deteksi kebuntuan Server SQL di sini: http://msdn.microsoft.com/en-us/library/ms178104.aspx



Pemilik transaksi / pengembang aplikasi bertanggung jawab untuk meminimalkan risiko kebuntuan yang terjadi, dan untuk melakukan bahwa mereka harus:

  1. Pastikan untuk menjaga transaksi sesingkat mungkin. Misalnya, jangan tampilkan formulir login setelah memulai transaksi dan tunggu input pengguna, alih-alih kumpulkan semua info yang Anda butuhkan lalu jalankan transaksi.
  2. Gunakan tingkat isolasi serendah mungkin, mis. Jangan mengatur serializable ketika Anda hanya ingin sementara menunjukkan beberapa nilai kepada pengguna. Harap dicatat bahwa pengaturan tingkat isolasi yang benar adalah ilmu itu sendiri dan di luar ruang lingkup dalam jawaban ini.
  3. Jika Anda adalah korban dari kebuntuan, yaitu Anda mendapatkan kesalahan # 1205, kemudian jalankan kembali transaksi Anda secara transparan kepada pengguna Anda. Karena yang lain, bersaing, transaksi sekarang diharapkan mendapatkan sumber daya yang ditunggu dan selesai, tidak mungkin Anda akan menemui jalan buntu yang sama lagi.
Andreas Ågren
sumber
4. Dapatkan sumber daya dan lakukan pembaruan / hapus / masukkan pola dalam urutan yang sama secara konsisten di seluruh aplikasi.
ErikE
3
@ErikE seringkali tidak mungkin / layak untuk "melakukan pembaruan / menghapus / menyisipkan pola dalam urutan yang sama secara konsisten di seluruh aplikasi", meskipun saran yang dipertanyakan ini sangat populer di Web. Detail di sini: sqlblog.com/blogs/alexander_kuznetsov/archive/2010/01/15/…
AK
1
Poin bagus. Tetapi saya masih berpikir upaya itu bermanfaat, asalkan tidak ada ilusi bahwa itu akan selalu mungkin atau selalu memperbaiki masalah. Hal induk / anak itu menarik, bagaimana dengan kaskade menghapus atau memperoleh kunci pembaruan pada baris induk? Dan jika Anda melakukan penggabungan tanpa MERGE, mengapa tidak konsisten? Saya menghapus-> memperbarui-> menyisipkan secara pribadi.
ErikE
1
@AlexKuznetsov: Ini bukan peluru pemecah tetapi tidak boleh diberhentikan. Saya telah mengurangi (tidak menghilangkan) kebuntuan dengan cara ini: melalui analisis statis dari kode yang sering dijalankan yang mengalami kebuntuan setiap hari atau 7. Saya sarankan "optimasi prematur" berlaku dll
gbn
Saya tidak setuju dengan rekomendasi nomor 3. Ketika kami mencoba lagi setelah kebuntuan, kami sangat mungkin untuk menimpa perubahan proses lain. Kita perlu menyadari bahwa sangat mungkin orang lain memodifikasi data yang ingin kita modifikasi. Terutama jika semua pembaca berjalan di bawah isolasi snapshot, maka pembaca tidak dapat terlibat dalam kebuntuan, yang berarti bahwa semua pihak yang terlibat dalam kebuntuan adalah penulis, dimodifikasi atau berusaha untuk memodifikasi data yang sama. Jika kami menangkap pengecualian dan mencoba lagi secara otomatis, kami dapat menimpa perubahan orang lain. Ini disebut pembaruan yang hilang, dan ini biasanya salah.
AK