Kami menjalankan SQL Server 2000 dan kami mendapatkan beberapa kesalahan ini setiap malam.
Could not continue scan with NOLOCK due to data movement
Kueri yang melempar kesalahan ini adalah kueri kompleks besar yang bergabung dengan lebih dari selusin tabel. Data dasar kami dapat sering diperbarui.
'Praktik terbaik' budaya adalah, di masa lalu, pengenalan NOLOCK
petunjuk meningkatkan kinerja dan meningkatkan konkurensi. Kueri ini tidak harus 100% akurat, yaitu kami akan mentolerir pembacaan yang kotor dll. Namun, kami berjuang untuk memahami mengapa database melempar kesalahan ini, meskipun kami memiliki semua petunjuk penguncian ini.
Adakah yang bisa menjelaskan ini - lembut, saya sebenarnya seorang programmer, bukan DBA :)
PS: Kami telah menerapkan perbaikan yang disebutkan di bawah ini sebelumnya: http://support.microsoft.com/kb/815008
sumber
Jawaban:
Ini adalah masalah yang cukup terkenal dengan SQL Server 2000 - pada dasarnya, apa yang terjadi adalah jika sebuah baris dihapus oleh proses A saat proses B sedang melakukan pemindaian (baik pada
READ UNCOMMITTED
atauWITH (NOLOCK)
), maka proses B berjalan "ya apa yang terjadi pada data ini "Ketika mencoba membacanya. Lebih tepatnya, baris harus dihapus setelah proses B membaca indeks, tetapi sebelum mencoba membaca baris data.Craig Freedman memberikan tulisan yang bagus di sini
Untungnya, perbaikannya relatif sederhana: http://support.microsoft.com/kb/815008
Jika itu tidak berhasil, Anda memiliki opsi yang sedikit lebih menyakitkan untuk menghapus semua
WITH (NOLOCK)
petunjuk Anda dan mengatur tingkat isolasi transaksi Anda ke sesuatu di atasREAD UNCOMMITTED
.sumber