Sekitar sekali seminggu saya harus menyelesaikan rantai pemblokiran pada database SQL Server 2005, yang disebabkan oleh kunci baca yang berumur panjang dari front-end Access 2003. Kunci diambil ketika pengguna membuka formulir tertentu dan dilepaskan setelah pengguna selesai menggulir formulir atau menutupnya. Karena banyak pengguna kami membuka formulir ini sebagai referensi, kunci ini tetap ada untuk sementara waktu. Pembaruan apa pun ke tabel menyebabkan pemblokiran, dan tiba-tiba tidak ada yang dapat memilih dari tabel ini karena mereka semua menunggu di kunci pertama. Ini merupakan masalah bagi kami, karena banyak aplikasi mengandalkan data ini. Saya mengerti bahwa perilaku penguncian ini adalah bagian dari cara Access bekerja dengan tabel tertaut.
Saya telah memecahkan masalah dari Activity Monitor, dengan membunuh proses SELECT mana pun yang merupakan Pemblokir Utama setiap kali saya mengetahuinya. Ini adalah masalah tidak hanya karena saya butuh waktu untuk melakukannya secara manual, tetapi juga karena itu reaktif. Pada saat saya mendengarnya, itu sudah menjadi masalah bagi banyak orang.
Saya ingin tahu apakah ada cara otomatis untuk memeriksa rantai pemblokiran yang tahan lama ini, dan apakah akan diemail atau memiliki masalah diselesaikan secara otomatis. Logikanya tampak cukup jelas ("jika ada proses yang cocok dengan kueri SELECT ini telah memblokir lebih dari satu menit, beri tahu saya / bunuh saja") tetapi saya tidak tahu bagaimana menerapkannya dengan SQL Server.
Untuk apa nilainya, saya pikir solusi yang tepat adalah memperbaiki atau menulis ulang aplikasi. Namun, karena politik departemen, ini bukan pilihan untuk beberapa bulan ke depan, jadi saya mencari penghenti sementara.
sumber
Jawaban:
Sudahkah Anda mempertimbangkan untuk menggunakan isolasi snapshot ? Mengaktifkan read_committed_snapshot dalam database akan menyebabkan semua pembacaan (pilihan) bebas dari kunci:
Tidak ada perubahan aplikasi. Beberapa semantik berubah di bawah snapshot dan aplikasi Anda mungkin bereaksi aneh, tapi itu pengecualian bukan norma. Sebagian besar aplikasi tidak melihat perbedaan, mereka hanya mendapatkan peningkatan kinerja gratis.
Bagaimanapun, saya juga menjawab pertanyaan awal : bagaimana mendeteksi (dan mungkin membunuh) permintaan yang sudah berjalan lama. Sebenarnya, mesin sudah melakukan itu untuk Anda. Ada peristiwa yang dimunculkan ketika ambang dilewatkan: Proses yang Diblokir Laporan Acara . Ambang dikonfigurasi melalui Opsi ambang proses yang diblokir . Setiap acara jejak dapat diubah menjadi Pemberitahuan Acara dan pemberitahuan acara dapat mengaktifkan prosedur . Hubungkan titik-titik dan Anda memiliki kode diaktifkan berdasarkan permintaan yang berjalan ketika mesin mendeteksi kueri yang telah melewati ambang waktu eksekusi. Tidak ada polling, tidak ada pemantauan. Perhatikan bahwa notifikasi tidak sinkron, pada saat Anda memprosesnya, kueri mungkin telah selesai sehingga harus diperhitungkan.
Berikut ini sebuah contoh:
Sekarang di kueri baru siapkan
WAITFOR
pemberitahuan menunggu:Dan lanjutkan dan menyebabkan beberapa penyumbatan. Saya menggunakan proses yang membuat tabel dan tidak melakukan, dan dari jendela kueri lain saya mencoba memilih dari tabel. Dalam 20 detik (ambang konfigurasi saya di atas) saya mendapat laporan pemblokiran:
Saya akan meninggalkan tugas membungkus ini menjadi proses otomatis sebagai latihan untuk pembaca. Dan ya, prosedur antrian / layanan / diaktifkan harus dalam
[msdb]
.sumber
Anda dapat membuat alat pemantauan sendiri atau mencari solusi pihak ketiga yang dapat menyediakannya untuk Anda. Jika Anda tertarik untuk membangun sendiri, itu tergantung pada versi SQL Server yang Anda gunakan. Jika tahun 2005, Anda dapat menggunakan acara pelacakan Laporan Proses Diblokir . Jika Anda menjalankan 2008 atau di atas, saya sarankan menggunakan acara diperpanjang yang setara, diblokir_process_report. Jonathan Kehayias memiliki tulisan yang bagus tentang cara menggunakannya.
Jika Anda melihat produk pihak ke-3, Monitor SQL perangkat lunak Red Gate telah memblokir proses dan peringatan proses yang telah berjalan lama.
sumber
Meskipun ini tidak membahas cara memberi tahu Anda tentang masalah ini, prosedur ini akan menunjukkan kepada Anda bagaimana cara menanyakan apakah ada pemblokiran. Ini juga akan menghasilkan perintah kill untuk Anda, jika Anda memasukkan parameter yang benar.
Semoga ini memberi Anda beberapa ide.
sumber
Saya sarankan membaca topik forum MSDN berikut . Ini tentang penguncian yang disebabkan oleh Akses ke SQL Server db. Saran utamanya adalah mengakses tabel dengan kueri menggunakan petunjuk NOLOCK, sehingga tidak akan menyebabkan masalah penguncian. NOLOCK bukan solusi terbaik, karena dapat menyebabkan masalah lain, tetapi akan mengurangi sebagian besar masalah penguncian Anda.
Solusi yang lebih baik adalah dengan mengimplementasikan ide Remus, mengatur isolasi snapshot pada database Anda. Atau terapkan tingkat isolasi snapshot hanya untuk koneksi tertentu yang Anda temukan menyebabkan pemblokiran.
Agar dapat memonitor server Anda dengan benar untuk memblokir masalah, saya sarankan:
Jika Anda menginginkan respons proaktif terhadap masalah ini, alih-alih memiliki pekerjaan setiap jam untuk memantau jejak, buatlah itu berjalan setiap menit dan matikan sesi Akses pemblokiran terkemuka apa pun.
sumber
Mengikuti jawaban luar biasa @Remus Rusanu, saya telah melakukan tugas pembaca untuk menghubungkan acara ke prosedur yang tersimpan.
Dalam kasus saya sp akan menulis xml acara pemblokiran ke tabel, tetapi Anda bebas melakukan apa pun yang Anda inginkan pada posisi itu.
Jadi, ikuti kode Remus dan buat
queue
, denganservice
dannotification
dengan copy / paste sederhana dari atas. Tambahkansp_configure
opsi dan Anda pada dasarnya sudah diatur.Satu-satunya hal yang harus dilakukan adalah
queue
Segera setelah Anda mengaktifkan SP, acara akan mulai mengalir ke meja Anda.
Saya menemukan bahwa antrian segera menonaktifkan dirinya sendiri, jika SP memiliki kesalahan. Dalam hal ini, Anda harus pergi ke Server Studio dan mengaktifkannya lagi di menu konteks entri antrian (
[msdb]->Service Broker->Warteschlangen
dalam versi Jerman).Butuh beberapa waktu untuk menyelesaikannya dan menemukan tempat yang tepat dalam dokumentasi, jadi saya kira ini juga bermanfaat bagi orang lain. Saya menggunakan SQLServer 2005.
Buat SP tanpa argumen
Buat
pdix_lock_events
tabelAktifkan SP di
queue
sumber