เหตุใดจึงต้องใช้ระดับการแยก READ UNCOMMITTED


225

ในภาษาอังกฤษธรรมดาสิ่งที่เป็นข้อเสียและข้อดีของการใช้

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

ในแบบสอบถามสำหรับ. NET แอปพลิเคชันและบริการรายงานแอปพลิเคชัน

คำตอบ:


210

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

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

คุณอาจต้องการตรวจสอบบทความ WikipediaREAD UNCOMMITTEDสำหรับตัวอย่างและอ่านเพิ่มเติม


คุณอาจสนใจตรวจสอบบทความบล็อกของ Jeff Atwood เกี่ยวกับวิธีที่เขาและทีมของเขาจัดการกับปัญหาการหยุดชะงักในช่วงแรก ๆ ของ Stack Overflow อ้างอิงจากเจฟ:

แต่nolockอันตรายไหม คุณสามารถอ่านข้อมูลที่ไม่ถูกต้องด้วยการread uncommittedเปิดหรือไม่ ใช่ในทางทฤษฎี คุณจะพบปัญหาการขาดแคลนนักบินอวกาศสถาปัตยกรรมฐานข้อมูลไม่มีที่เริ่มต้นวางวิทยาศาสตร์กรดกับคุณและทุกคน nolockแต่ดึงสัญญาณเตือนไฟไหม้อาคารเมื่อคุณบอกพวกเขาว่าคุณต้องการที่จะลอง เป็นจริง: ทฤษฎีนั้นน่ากลัว แต่นี่คือสิ่งที่ฉันคิด: "ในทางทฤษฎีไม่มีความแตกต่างระหว่างทฤษฎีและการปฏิบัติในทางปฏิบัติมี"

ฉันจะไม่แนะนำให้ใช้nolock เป็น "ดีสำหรับสิ่งที่คุณ" แก้ไขน้ำมันงูสำหรับฐานข้อมูลใด ๆ ที่อาจมีปัญหาการหยุดชะงัก คุณควรลองวิเคราะห์สาเหตุของปัญหาก่อน

แต่ในทางปฏิบัติการเพิ่มnolockคำค้นหาที่คุณรู้ว่าเป็นเรื่องง่ายและอ่านอย่างเดียวนั้นไม่เคยนำไปสู่ปัญหา ... ตราบใดที่คุณรู้ว่าคุณกำลังทำอะไรอยู่

หนึ่งทางเลือกให้กับระดับที่คุณอาจต้องการที่จะต้องพิจารณาคือREAD UNCOMMITTED READ COMMITTED SNAPSHOTการอ้างเจฟฟ์อีกครั้ง:

สแนปชอตอาศัยวิธีการติดตามการเปลี่ยนแปลงข้อมูลใหม่ทั้งหมด ... มากกว่าการเปลี่ยนแปลงเชิงตรรกะเพียงเล็กน้อยโดยเซิร์ฟเวอร์จะต้องจัดการกับข้อมูลที่แตกต่างกัน เมื่อเปิดใช้งานวิธีการติดตามการเปลี่ยนแปลงข้อมูลใหม่มันจะสร้างสำเนาหรือภาพรวมของการเปลี่ยนแปลงข้อมูลทุกครั้ง ด้วยการอ่านสแนปชอตเหล่านี้แทนการใช้ข้อมูลสดในช่วงเวลาของการช่วงชิงจึงไม่จำเป็นต้องใช้ Shared Locks ในการอ่านอีกต่อไปและประสิทธิภาพของฐานข้อมูลโดยรวมอาจเพิ่มขึ้น


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

4
คำตอบที่ดี BTW, Oracle มี "snapshot" เป็นค่าเริ่มต้นตั้งแต่ฉันรู้ว่าอาจเป็นทศวรรษก่อนที่ SQL Server จะแนะนำ ฉันค่อนข้างผิดหวังเมื่อเริ่มต้นด้วย SQL Server และฉันพบว่าปัญหาการทำงานพร้อมกันทั้งหมดได้รับการแก้ไขโดยใช้กลไกการล็อคแบบ "ดั้งเดิม" ไม่เคยเห็น "อ่านปราศจากข้อผูกมัด" ใน Oracle และผู้ประกอบการก็มีความสุขเท่ากับนักบินอวกาศ
Stefan Steinegger

13
READ UNCOMMITTEDอาจทำให้คุณอ่านแถวสองครั้งหรือพลาดทั้งแถวก็ได้ หากการแบ่งหน้าเกิดขึ้นขณะที่คุณกำลังอ่านคุณสามารถพลาดข้อมูลทั้งหมดได้ WITH(NOLOCK)ควรใช้เฉพาะในกรณีที่ความแม่นยำของผลลัพธ์ไม่สำคัญ
Ian Boyd

8
@DanielNolan แนะนำว่าบทความนั้นมีอันตรายเพราะJeff ไม่รู้ว่าเขากำลังทำอะไรอยู่ read-uncommmited เท่านั้นเหมาะสมสำหรับการอ่านข้อมูลจะไม่ถูกแก้ไข พยายามที่จะใช้ในการอ่านตารางที่จะเขียนเพื่อหมายความว่าในทางปฏิบัติคุณจะอ่านสิ่งที่ได้รับการย้อนกลับ ไม่ใช่แค่ว่าคุณกำลังอ่านข้อมูลที่มีอายุไม่กี่วินาที แต่คุณ .................................. ................... ........................... ....
Pacerier

5
................................... กำลังอ่านข้อมูลที่ไม่เคยเกิดขึ้นมาก่อน นั่นคือคำจำกัดความของการอ่านที่เสียหาย และถ้าคุณกำลังจะเขียนตามผลลัพธ์ของการอ่านที่ปราศจากข้อผูกมัดคุณจะต้องเขียนข้อมูลที่เสียหาย นอกจากนี้บทความระบุว่า "MySQL ซึ่งเติบโตขึ้นมาบนเว็บแอปนั้นมองโลกในแง่ร้ายน้อยกว่า SQL Server" ไม่เป็นความจริง Sql Server ทำงานในระดับที่อ่านแล้วเป็นค่าเริ่มต้นในขณะที่ MySQL ทำงานที่ทำซ้ำได้อ่านโดยค่าเริ่มต้นห้าระดับอยู่ห่างจากที่ไม่ต้องอ่าน
Pacerier

36

สิ่งนี้มีประโยชน์ในการดูความคืบหน้าของการสืบค้นแบบแทรกแบบยาวทำการประมาณคร่าวๆ (เช่นCOUNT(*)หรือแบบคร่าวๆSUM(*)) เป็นต้น

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


36

กรณีการใช้งานที่ชื่นชอบสำหรับฉันread uncommitedคือการแก้ไขข้อบกพร่องบางอย่างที่เกิดขึ้นในการทำธุรกรรม

เริ่มซอฟต์แวร์ของคุณภายใต้ดีบักเกอร์ในขณะที่คุณกำลังก้าวผ่านบรรทัดของรหัสมันจะเปิดธุรกรรมและปรับเปลี่ยนฐานข้อมูลของคุณ ในขณะที่รหัสหยุดทำงานคุณสามารถเปิดตัววิเคราะห์แบบสอบถามตั้งค่าระดับการแยกแบบอ่านที่ไม่ได้รับการตอบรับและสร้างคิวรีเพื่อดูว่าเกิดอะไรขึ้น

นอกจากนี้คุณยังสามารถใช้เพื่อดูว่าขั้นตอนการรันนานหรือติดตั้งหรือปรับปรุงฐานข้อมูลของคุณอย่างถูกต้อง

เป็นการดีถ้า บริษัท ของคุณชอบทำขั้นตอนการจัดเก็บที่ซับซ้อนมากเกินไป


6
บริษัท ของฉันชอบทำขั้นตอนการจัดเก็บที่ซับซ้อนมากเกินไป เป็นความคิดที่ดีสำหรับการแก้ไขปัญหา!
Brandon

22

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

หากคุณใส่ใจในความถูกต้องอย่าใช้สิ่งนี้

ข้อมูลเพิ่มเติมเกี่ยวกับMSDN :

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


สิ่งนี้จะส่งผลต่อความเร็วของการสืบค้นอย่างไร
Kip Real

11
@Kip - selectคำสั่งไม่ต้องรอที่จะได้รับการล็อคที่ใช้ร่วมกันในทรัพยากรที่ถูกล็อคโดยการทำธุรกรรมอื่น ๆ
Jarrod Dixon

15

จะใช้READ UNCOMMITTEDเมื่อไร?

หลักการง่ายๆ

ดี : รายงานรวมขนาดใหญ่แสดงยอดรวมที่เปลี่ยนแปลงตลอดเวลา

มีความเสี่ยงเกือบทุกอย่าง

ข่าวดีก็คือรายงานส่วนใหญ่จะอยู่ในหมวดหมู่ที่ดีเท่านั้น

รายละเอียดเพิ่มเติม...

ตกลงที่จะใช้มัน:

  • เกือบทุกรายงานสรุปที่ผู้ใช้รายงานข้อมูลปัจจุบันและไม่คงที่เช่นยอดขายตั้งแต่ต้นจนถึงปัจจุบัน มันมีความเสี่ยงที่จะเกิดข้อผิดพลาด (อาจ <0.1%) ซึ่งต่ำกว่าปัจจัยความไม่แน่นอนอื่น ๆ เช่นการป้อนข้อผิดพลาดหรือการสุ่มเมื่อข้อมูลถูกบันทึกทุกนาที

ซึ่งครอบคลุมส่วนใหญ่ของแผนก Business Intelligence ที่จะทำใน SSRS ข้อยกเว้นคืออะไรที่มีเครื่องหมาย $ อยู่ข้างหน้า หลายคนบัญชีเงินด้วยความกระตือรือร้นมากกว่าที่ใช้กับตัวชี้วัดหลักที่เกี่ยวข้องที่จำเป็นในการให้บริการลูกค้าและสร้างเงินนั้น (ฉันโทษนักบัญชี)

เมื่อมีความเสี่ยง

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

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

  • เกือบทุกอย่างที่ฟีดแอปพลิเคชันซึ่งมีความสามารถในการเขียน

เมื่อแม้แต่สถานการณ์ OK ก็ไม่เป็นไร

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

จุดดีเกี่ยวกับรายงาน ที่จริงแล้วความคิดแรกที่มาถึงใจของฉันคือถ้าฉันควรใช้read uncommittedสำหรับเว็บแอปพลิเคชันเมื่อผู้ใช้เห็นกริด UI บางส่วนที่ความแม่นยำของข้อมูลไม่สำคัญนัก ผู้ใช้ต้องการภาพรวมอย่างรวดเร็วว่ามีระเบียนใดบ้างและอาจมีการแบ่งหน้าการเรียงลำดับและการกรอง เฉพาะเมื่อผู้ใช้คลิกปุ่มแก้ไขจากนั้นฉันพยายามอ่านระเบียนล่าสุดที่มีระดับการแยกที่เข้มงวดมากขึ้น วิธีการดังกล่าวไม่ควรจะดีกว่าในแง่ของประสิทธิภาพ?
JustAMartin

ใช่ฉันคิดว่ามันสมเหตุสมผล โปรดจำไว้ว่าปัญหาที่สำคัญยิ่งกว่านั้นคือการทำให้แน่ใจว่าคนอื่นไม่ได้รับการเปลี่ยนแปลงข้อมูลระหว่างเวลากดปุ่มแก้ไขและเวลาที่ส่ง select item from things with (UPDLOCK)คุณสามารถจัดการว่าด้วยการเริ่มต้นการทำธุรกรรมการเรียกข้อมูลเช่น ใส่ไทม์เอาต์อย่างรวดเร็วไว้ที่นั่นเพื่อที่ว่าถ้ามันไม่สามารถล็อคได้อย่างรวดเร็วมันจะบอกผู้ใช้ว่ามันกำลังถูกแก้ไข ที่จะทำให้คุณปลอดภัยไม่เพียง แต่จากผู้ใช้ แต่นักพัฒนา ปัญหาเฉพาะที่นี่คือคุณต้องเริ่มคิดเกี่ยวกับการหมดเวลาและวิธีจัดการกับ UI
Adamantish

6

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


4

ใช้ READ_UNCOMMITTED ในสถานการณ์ที่แหล่งที่มาไม่น่าจะเปลี่ยนแปลงได้อย่างมาก

  • เมื่ออ่านข้อมูลในอดีต เช่นบันทึกการใช้งานบางอย่างที่เกิดขึ้นเมื่อสองวันก่อน
  • เมื่ออ่านข้อมูลเมตาอีกครั้ง เช่นแอปพลิเคชันที่ใช้เมทาดาทา

อย่าใช้ READ_UNCOMMITTED เมื่อคุณรู้ว่า souce อาจมีการเปลี่ยนแปลงระหว่างการดึงข้อมูล


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

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

ใช่ฉันมักจะเห็นด้วยกับ @Adamantish ที่นี่ - คุณสามารถได้รับประโยชน์จากREAD UNCOMMITTEDสถานการณ์ส่วนใหญ่เมื่อข้อมูลของคุณถูกใช้อย่างแข็งขันและคุณต้องการลดภาระบนเซิร์ฟเวอร์เพื่อหลีกเลี่ยงการหยุดชะงักและการย้อนกลับการทำธุรกรรมเพียงเพราะผู้ใช้บางคน รีเฟรช "ในหน้าเว็บที่มี DataGrid ผู้ใช้ที่ดูบันทึกจำนวนมากในเวลาเดียวกันโดยทั่วไปจะไม่สนใจอะไรมากหากข้อมูลนั้นล้าสมัยหรืออัปเดตบางส่วน เมื่อผู้ใช้กำลังจะแก้ไขบันทึกคุณอาจต้องการให้ข้อมูลที่ถูกต้องที่สุดแก่เขา / เธอ
JustAMartin

2

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

มันน่าสนใจที่จะทราบว่าอะไรไม่เกิดขึ้น READ UNCOMMITTED ไม่เพียง แต่ละเว้นการล็อคตารางอื่น ๆ นอกจากนี้ยังไม่ก่อให้เกิดการล็อคใด ๆ ในตัวเอง

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

หากคุณใช้ READ UNCOMMITTED คุณจะไม่ตั้งค่าการล็อคที่ใช้ร่วมกันบนโต๊ะ คุณอาจได้รับผลจากการทำธุรกรรมใหม่บางอย่างหรือคุณอาจไม่ได้ขึ้นอยู่กับตารางที่ข้อมูลถูกแทรกและระยะเวลาที่การทำธุรกรรม SELECT ของคุณอ่าน คุณอาจได้รับข้อมูลเดียวกันสองครั้งหากมีการแบ่งหน้า (ข้อมูลจะถูกคัดลอกไปยังตำแหน่งอื่นในไฟล์ข้อมูล)

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

วิธีที่ดีกว่าโดยสิ้นเชิงคือการใช้ SNAPSHOT ISOLATION LEVEL แต่แอปพลิเคชันของคุณอาจต้องมีการปรับเปลี่ยนเพื่อใช้งานนี้ ตัวอย่างหนึ่งคือหากแอปพลิเคชันของคุณใช้การล็อกแบบเอกสิทธิ์เฉพาะบุคคลในแถวเพื่อป้องกันไม่ให้ผู้อื่นอ่านและเข้าสู่โหมดแก้ไขใน UI SNAPSHOT ISOLATION LEVEL ระดับนั้นมาพร้อมกับประสิทธิภาพที่สูง (โดยเฉพาะบนดิสก์) แต่คุณอาจเอาชนะมันได้ด้วยการโยนฮาร์ดแวร์ลงบนปัญหา :)

คุณอาจพิจารณากู้คืนข้อมูลสำรองของฐานข้อมูลเพื่อใช้สำหรับการรายงานหรือโหลดข้อมูลลงในคลังข้อมูล


0

สามารถใช้สำหรับตารางอย่างง่ายตัวอย่างเช่นในตารางตรวจสอบแบบแทรกเท่านั้นซึ่งไม่มีการอัพเดตแถวที่มีอยู่และไม่มี fk ไปยังตารางอื่น เม็ดมีดเป็นเม็ดมีดแบบง่าย ๆ ซึ่งไม่มีโอกาสย้อนกลับเล็กน้อย


-7

ฉันใช้ READ UNCOMMITTED เสมอ มันรวดเร็วด้วยปัญหาน้อยที่สุด เมื่อใช้ตัวแยกอื่น ๆ คุณจะพบเจอปัญหาการบล็อกบางอย่าง

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

คุณสามารถทำข้อผิดพลาดกับ READ UNCOMMITED แต่ตามจริงแล้วมันเป็นเรื่องง่ายมากที่จะทำให้แน่ใจว่าส่วนแทรกของคุณนั้นมีการพิสูจน์อย่างสมบูรณ์ ส่วนแทรก / อัพเดตที่ใช้ผลลัพธ์จากตัวเลือกเป็นสิ่งเดียวที่คุณต้องระวัง (ใช้ READ COMMITTED ที่นี่หรือตรวจสอบให้แน่ใจว่าการอ่านที่สกปรกจะไม่ทำให้เกิดปัญหา)

ดังนั้นไปที่ Dirty Reads (พิเศษสำหรับรายงานขนาดใหญ่) ซอฟต์แวร์ของคุณจะทำงานได้ราบรื่นขึ้น ...


6
สิ่งนี้ไม่ถูกต้องอย่างมากและสัมผัสกับพื้นผิวของปัญหาที่สามารถเกิดขึ้นได้กับ nolock เท่านั้น หน้าสามารถแยกเข้าร่วมสามารถล้มเหลวคุณสามารถอ่านข้อมูลที่ไม่มีอยู่หรือข้อมูลที่ซ้ำกัน ไม่มีวิธีที่จะทำให้การใช้งานนั้นผิดพลาดได้: คุณไม่สามารถเชื่อถือความถูกต้องของสิ่งใดภายใต้ระดับการแยกนี้ อ่าน COMMITTED SNAPSHOT เป็นอันตรายน้อย "ยาครอบจักรวาลปลอม"
Mark Sowul

@ MarkSowul downvoting ของคำตอบนี้ดูเหมือนจะไม่ยุติธรรมสำหรับฉัน @Clive ชัดเจนว่าเขาต้องการเปลี่ยนเป็นCommittedแทรกและอัปเดต สำหรับปัญหาอื่น ๆ เขายังแสดงให้เห็นถึงการตระหนักถึงปัญหาการแบ่งหน้าโดยกล่าวถึงการใช้คีย์การเพิ่มอัตโนมัติ ฉันเห็นด้วยกับเขาว่าการรายงานสดเกือบทุกเรื่องที่มนุษย์อ่านสามารถทนต่อความคลาดเคลื่อนเล็กน้อยในตำแหน่งทศนิยมสุดท้าย ฉันเห็นด้วยว่ามันเป็นเรื่องราวที่แตกต่างกันสำหรับรายการที่มีรายละเอียดหรือข้อมูลที่กำหนดให้เป็นเครื่องอ่านและแปลงและ Clive
Adamantish

1
ความคิดเห็นนี้แสดงให้เห็นถึงการขาดความเข้าใจอย่างเต็มรูปแบบของปัญหาที่อาจเกิดขึ้นที่มาพร้อมกับ nolock "ความคลาดเคลื่อนเล็กน้อยในตำแหน่งทศนิยมสุดท้าย" นั้นแทบจะไม่ครอบคลุม แม้แต่การแตะที่ "เพียงแค่ใช้การอ่านเพื่อการแทรก / อัปเดต" นั้นไม่ถูกต้องตามคำแนะนำทั่วไป (ถ้าหาก "การแทรกเร็กคอร์ดถ้าไม่มี ในกรณีใด ๆ "[อ่านปราศจากข้อผูกมัด] รวดเร็วด้วยปัญหาน้อยที่สุด" นั้นผิดหมวดหมู่
Mark Sowul

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