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:
- Identifikasi utas yang tidak dapat diraih (mis. Utas yang memutar kembali transaksi tidak bisa diraih).
- Temukan utas dengan prioritas deadlock terendah.
- 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:
- 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.
- 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.
- 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.