ไม่สามารถสแกนด้วย NOLOCK ต่อเนื่องจากการเคลื่อนไหวของข้อมูล


10

เราเรียกใช้ SQL Server 2000 และเราได้รับข้อผิดพลาดเล็กน้อยทุกคืน

Could not continue scan with NOLOCK due to data movement

แบบสอบถามที่ส่งข้อผิดพลาดนี้เป็นแบบสอบถามที่ซับซ้อนขนาดใหญ่ที่รวมอยู่เหนือตารางโหล ข้อมูลพื้นฐานของเราสามารถอัปเดตบ่อยครั้ง

'การปฏิบัติที่ดีที่สุด' ทางวัฒนธรรมคือในอดีตการแนะนำของNOLOCKคำแนะนำที่เพิ่มประสิทธิภาพและการปรับปรุงพร้อมกัน แบบสอบถามนี้ไม่จำเป็นต้องมีความแม่นยำ 100% เช่นเราจะทนต่อการอ่านที่สกปรก ฯลฯ อย่างไรก็ตามเราพยายามที่จะเข้าใจว่าเหตุใดฐานข้อมูลจึงโยนข้อผิดพลาดนี้ถึงแม้ว่าเราจะมีคำแนะนำการล็อคเหล่านี้ทั้งหมด

ทุกคนสามารถให้ความกระจ่างเกี่ยวกับเรื่องนี้ - อ่อนโยนฉันเป็นโปรแกรมเมอร์ไม่ใช่ DBA :)

PS: เราได้ใช้การแก้ไขที่กล่าวถึงด้านล่างก่อนหน้านี้: http://support.microsoft.com/kb/815008


3
ฉันจะวาง NOLOCK และแก้ไขแบบสอบถาม / ดัชนี / กระบวนการ เราสามารถช่วยได้แน่นอน ... ดูen.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi: SQL 2012 กู้คืนได้อย่างงดงามในหลาย ๆ กรณีของการเคลื่อนย้ายข้อมูลภายใต้การสแกนที่สกปรก (ดำเนินการต่อในหน้าถัดไปตามลำดับการจัดสรร)
Remus Rusanu

1
@SQLKiwi: ใช่ยังมีอยู่ ในข่าวดี: เคอร์เซอร์ที่ได้รับการสนับสนุนจากการสแกนที่สกปรกควรจัดการกับสิ่งนี้ได้อย่างงดงามยิ่งขึ้น
Remus Rusanu

คำตอบ:


7

นี่เป็นปัญหาที่รู้จักกันดีพอสมควรกับ SQL Server 2000 - เป็นหลักสิ่งที่เกิดขึ้นคือถ้าแถวถูกลบโดยกระบวนการ A ในขณะที่กระบวนการ B กำลังสแกน (ทั้งที่READ UNCOMMITTEDหรือWITH (NOLOCK)) จากนั้นกระบวนการ B ไป "huh เกิดอะไรขึ้นกับข้อมูลนี้ "เมื่อพยายามอ่าน แม่นยำยิ่งขึ้นแถวจะต้องถูกลบหลังจากกระบวนการ B อ่านดัชนี แต่ก่อนที่จะพยายามอ่านแถวข้อมูล

Craig Freedman เขียนบทความได้ดีที่นี่

โชคดีที่การแก้ไขนั้นค่อนข้างง่าย: http://support.microsoft.com/kb/815008

หากไม่ได้ทำงานคุณมีตัวเลือกเล็กน้อยเจ็บปวดมากขึ้นของการลบของคุณทุกคำแนะนำและการตั้งค่าระดับการแยกการทำธุรกรรมของคุณเพื่อสิ่งดังกล่าวข้างต้นWITH (NOLOCK)READ UNCOMMITTED


เราได้รับการแก้ไขล่าสุด - เราใช้การตั้งค่าสถานะเริ่มต้นใหม่และเรายังคงได้รับข้อผิดพลาดเหล่านี้
Ciaran Archer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.