วิธีการทำซ้ำ“ ไม่สามารถสแกนด้วย NOLOCK ต่อเนื่องจากการเคลื่อนไหวของข้อมูล”


10

ฉันได้รับบางครั้ง "ไม่สามารถสแกนต่อNOLOCKเนื่องจากการเคลื่อนไหวของข้อมูล" กับงานขนาดใหญ่บางงานซึ่งมีWITH (NOLOCK)ในแบบสอบถามแบบใช้เลือกข้อมูล

ฉันเข้าใจว่าสิ่งนี้เกี่ยวข้องกับการพยายามเลือกข้อมูลเมื่อมีการแบ่งหน้าซึ่งทำให้ข้อมูลไม่ได้อยู่ในที่ที่ควรจะเป็นอีกต่อไป - ฉันคิดว่าเป็นสิ่งที่เกิดขึ้นในสภาพแวดล้อมของฉัน

ฉันจะทำสิ่งนี้ซ้ำได้อย่างไร

ฉันพยายามหาวิธีแก้ปัญหาระยะสั้นเพื่อตรวจจับข้อผิดพลาดและลองใหม่เมื่อเกิดเหตุการณ์นี้ แต่ฉันไม่สามารถทดสอบได้หากฉันไม่สามารถทำซ้ำได้ มีวิธีที่เชื่อถือได้สมเหตุสมผลในการทำให้เกิดสิ่งนี้หรือไม่?

เมื่อมันเกิดขึ้นการดำเนินการค้นหาผลลัพธ์อีกครั้งสำเร็จ - ดังนั้นฉันไม่มีข้อกังวลใด ๆ เกี่ยวกับข้อมูลจริงหรือฐานข้อมูลที่เสียหายอย่างถาวร บางตารางในแบบสอบถาม (พร้อมกับดัชนี) ลดลงสร้างใหม่และ repopulated บ่อยครั้งดังนั้นฉันคิดว่ามันเป็นสิ่งที่เกี่ยวข้อง

การลบออกNOLOCKเป็นปัญหาระยะยาวของฉันที่จะจัดการกับ เหตุผลที่NOLOCKใส่ไว้ในตอนแรกก็คือการสืบค้นนั้นแย่มากจนพวกมันหยุดชะงักกับการทำธุรกรรมแบบวันต่อวันดังนั้นพวกเขาจึงNOLOCKช่วยกันหยุดการหยุดชะงัก (ซึ่งใช้ได้ผล) ดังนั้นฉันจึงต้องการความช่วยเหลือจากวงดนตรีในการช่วยเหลือแบบวงดนตรีจนกว่าเราจะสามารถแก้ปัญหาได้อย่างถาวร

ถ้าฉันสามารถสร้างมันขึ้นมาใหม่ได้ด้วย Hello World ฉันจะวางแผนว่าจะตบวงช่วยเหลือเข้ากับงานในเวลาไม่ถึงหนึ่งชั่วโมง ไม่สามารถทำการลบ - ค้นหา - และ - แทนที่NOLOCKเพราะฉันเริ่มได้รับการหยุดชะงักของแอพอีกครั้งซึ่งแย่กว่าสำหรับฉันมากกว่างานที่ล้มเหลวเป็นครั้งคราว

การใช้การแยกสแนปชอตแบบอ่านข้อมูลมุ่งมั่นเป็นไปได้ที่ดี - ฉันจะต้องทำงานกับทีมฐานข้อมูลของเราเพื่อรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้น ปัญหาส่วนหนึ่งของเราคือเราไม่มีผู้เชี่ยวชาญ SQL Server ที่จะจัดการกับสิ่งนั้นและฉันไม่เข้าใจระดับการแยกได้ดีพอที่จะทำการเปลี่ยนแปลงในตอนนี้


1
คุณคิดว่าจะถูกลบออกNOLOCKจากงานเหล่านี้หรือไม่ 601 ควรจะเป็นกังวลน้อยที่สุดหากผลการค้นหาเหล่านี้ควรจะมีความถูกต้อง พอลไวท์แสดงให้เห็นเป็นตัวอย่างที่น่ากลัวโดยเฉพาะอย่างยิ่งในการอ่านข้อมูลที่ไม่ควรจะเป็นไปได้ที่นี่
แอรอนเบอร์ทรานด์ด์

3
คุณสามารถตั้งDEADLOCK_PRIORITYไปLOWในงานเพื่อที่ว่าถ้ามีการติดตาย, งานที่จะล้มเหลวและไม่ใช้งาน หลังจากนั้นคุณสามารถค้นคว้าการหยุดชะงักและค้นหาสาเหตุที่เกิดขึ้นและแก้ไขปัญหานั้น อาจเป็นการแก้ไขที่ง่ายมากเช่นการสลับคำสั่งสองข้อความ ไม่ว่าปัญหาคือNOLOCKอะไรไม่ใช่ทางออกดังนั้นหยุดพยายามบังคับให้มันเป็นเพราะง่ายที่สุด
Aaron Bertrand

@AaronBertrand ขอบคุณไม่รู้เกี่ยวกับ DEADLOCK_PRIORITY - ฉันจะตรวจสอบดู เราพยายามติดตามการหยุดชะงัก แต่สิ่งเหล่านั้นเกิดขึ้นในช่วงเวลาต่าง ๆ ที่ดูเหมือนสุ่มและเพียงครั้งเดียวหรือสองครั้งต่อวันและไม่เคยทำซ้ำตามความต้องการ - งานตามกำหนดเวลาของเราทำงานหลายหมื่นคำสั่งทุกชั่วโมงและแอปของเราดำเนินการหลายร้อย ของการสืบค้นเมื่อใดก็ตามที่มันเพิ่งโหลดหน้าเว็บหรือบันทึกบางสิ่งและเราไม่ได้ติดตามว่าการสืบค้นใดที่เกี่ยวข้องกับการหยุดชะงัก ฉันไม่ได้ตั้งใจจะออกจาก NOLOCK ไปตลอดกาลซึ่งเป็นเหตุผลว่าทำไมเราจึงทำการค้นคว้าวิธีแก้ปัญหาระยะยาวที่ดีกว่า
wookie23

1
คุณพูดว่าคุณกำลังลำบากในการติดตามการหยุดชะงัก ระบุว่าคุณอยู่ในปี 2008 R2 คุณอาจดูที่นี่: sqlservercentral.com/articles/deadlock/65658 Jonathan Kehayias ทำการดึงข้อมูลการหยุดชะงักจากวงแหวนบัฟเฟอร์
Kenneth Fisher

คำตอบและความเห็นตอบโจทย์ปัญหาพื้นฐานได้ดี แต่คุณยังสนใจที่จะหาวิธีที่จะทำให้เกิดสิ่งนี้ขึ้นใหม่ในฐานะที่เป็นแบบฝึกหัดทางปัญญาหรือไม่?
James L

คำตอบ:


8

เนื่องจาก 'การช่วยเหลือแบนด์' ที่อาจเกิดขึ้นกับปัญหา NOLOCK คือการหยุดใช้ NOLOCK และเริ่มใช้การแยก READ_COMMITTED_SNAPSHOT ฉันต้องการชี้ให้คุณไปที่โพสต์บล็อกที่http://www.brentozar.comโดย Kendra Little: การนำ Snapshot หรืออ่านแล้ว snapshot แยกใน SQL Server: คู่มือ

Kendra ให้รายละเอียดจำนวนมากเกี่ยวกับประโยชน์และความเสี่ยงโดยใช้ระดับการแยก READ_COMMITTED_SNAPSHOT

  1. ระดับการแยกนี้กลายเป็นระดับการแยกเริ่มต้นสำหรับรหัสฐานข้อมูล
  2. คุณต้องมีผู้ใช้เพียงคนเดียวในฐานข้อมูลเพื่อทำการเปลี่ยนแปลงระดับการแยก READ_COMMITTED_SNAPSHOT
  3. แม้ว่าคุณจะใช้การแยก READ_COMMITTED_SNAPSHOT คุณก็ยังจำเป็นต้องลบคำแนะนำของ NOLOCK ออกเพราะมันจะแทนที่ค่าเริ่มต้น
  4. รหัสบางอย่างของคุณอาจมีปัญหาที่จำเป็นต้องบ่ม

บางปีที่ผ่านมาเราได้ดำเนินการ READ_COMMITTED_SNAPSHOT แยกบนฐานข้อมูลที่เป็นรุนแรงทุกข์ทรมานจากการปิดกั้น แต่เมื่อเราเปลี่ยนระดับการแยกเราเริ่มได้รับการหยุดชะงักในสองสามพื้นที่สำคัญ

ทำไมสิ่งนี้ถึงเกิดขึ้น เนื่องจากระดับการแยกก่อนหน้านี้ทำให้เกิดการบล็อกหนักรหัสอาจ "ไม่เคย" ถึงจุดหยุดชะงัก อย่างไรก็ตามด้วยการแยก READ_COMMITTED_SNAPSHOT แบบสอบถามอาจก้าวไปข้างหน้า อย่างไรก็ตามบางส่วนของธุรกรรมที่ไม่รอคอยเริ่มหยุดชะงัก

โชคดีที่กรณีของเราได้รับการแก้ไขอย่างรวดเร็วโดยการกำหนดจุดหยุดชะงักและปรับดัชนีในตารางสองตารางเพื่อให้มีลำดับคอลัมน์ที่มีเหตุผลมากขึ้น สิ่งนี้ลดปัญหาการล็อคของเราอย่างมาก

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