ฉันคิดว่าระดับความโดดเดี่ยวที่กล่าวมานั้นเหมือนกัน มีคนช่วยอธิบายด้วยตัวอย่างดีๆได้ไหมความแตกต่างหลักคืออะไร
ฉันคิดว่าระดับความโดดเดี่ยวที่กล่าวมานั้นเหมือนกัน มีคนช่วยอธิบายด้วยตัวอย่างดีๆได้ไหมความแตกต่างหลักคืออะไร
คำตอบ:
ความมุ่งมั่นในการอ่านคือระดับการแยกที่รับประกันว่าข้อมูลใด ๆ ที่อ่านได้กระทำในขณะที่อ่าน มัน จำกัด ผู้อ่านจากการมองเห็นการอ่านระดับกลาง, ไม่ จำกัด , 'สกปรก' ไม่มีสัญญาใด ๆ ว่าหากธุรกรรมซ้ำการอ่านจะพบข้อมูลเดียวกันข้อมูลมีอิสระในการเปลี่ยนแปลงหลังจากที่อ่านแล้ว
การอ่านซ้ำเป็นระดับการแยกที่สูงกว่าซึ่งนอกเหนือจากการรับประกันระดับการอ่านที่ยืนยันแล้วยังรับประกันได้ว่าข้อมูลใด ๆ ที่อ่านไม่สามารถเปลี่ยนแปลงได้หากธุรกรรมอ่านข้อมูลเดียวกันอีกครั้งมันจะค้นหาข้อมูลที่อ่านก่อนหน้านี้ และพร้อมที่จะอ่าน
ระดับการแยกถัดไปเป็นแบบอนุกรมทำให้การรับประกันแข็งแกร่งยิ่งขึ้น: นอกเหนือจากการรับประกันการอ่านที่ทำซ้ำได้ทุกอย่างแล้วยังรับประกันได้ว่าจะไม่มีข้อมูลใหม่ที่สามารถอ่านได้ในภายหลัง
สมมติว่าคุณมีตาราง T ที่มีคอลัมน์ C และมีหนึ่งแถวในแถวนั้นว่ามันมีค่า '1' และพิจารณาว่าคุณมีงานง่าย ๆ ดังต่อไปนี้:
BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;
นั่นเป็นงานง่ายที่ให้ผู้อ่านสองคนอ่านจากตาราง T โดยมีความล่าช้า 1 นาทีระหว่างกัน
หากคุณทำตามตรรกะข้างต้นคุณสามารถรู้ได้อย่างรวดเร็วว่าธุรกรรมที่ปรับให้เหมาะสมได้ในขณะที่พวกเขาอาจทำให้ชีวิตของคุณง่ายขึ้นคุณจะบล็อกการดำเนินการที่เกิดขึ้นพร้อมกันทุกครั้งอย่างสมบูรณ์เนื่องจากพวกเขาต้องการให้ไม่มีใครสามารถแก้ไขลบหรือแทรกแถว ระดับการแยกธุรกรรมเริ่มต้นของSystem.Transactions
ขอบเขต. Net นั้นสามารถทำให้เป็นอนุกรมได้และนี่มักจะอธิบายถึงประสิทธิภาพสุดซึ้งที่เกิดขึ้น
และในที่สุดก็ยังมีระดับการแยก SNAPSHOT ระดับการแยก SNAPSHOT ทำให้การรับประกันเหมือนกันกับ serializable แต่ไม่ใช่โดยการกำหนดให้ไม่มีธุรกรรมที่เกิดขึ้นพร้อมกันสามารถแก้ไขข้อมูล แต่จะบังคับให้ผู้อ่านทุกคนเห็นโลกของตัวเอง (เป็น 'ภาพรวม') สิ่งนี้ทำให้ง่ายต่อการโปรแกรมต่อต้านและปรับขนาดได้มากเนื่องจากไม่ได้บล็อกการปรับปรุงพร้อมกัน อย่างไรก็ตามประโยชน์นั้นมาพร้อมกับราคา: ปริมาณการใช้ทรัพยากรเซิร์ฟเวอร์เพิ่มเติม
อ่านเพิ่มเติม:
สถานะของฐานข้อมูลได้รับการปรับปรุงจากจุดเริ่มต้นของการทำธุรกรรม หากคุณดึงค่าใน session1 จากนั้นอัปเดตค่านั้นใน session2 การดึงอีกครั้งใน session1 จะส่งคืนผลลัพธ์เดียวกัน การอ่านสามารถทำซ้ำได้
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
ภายในบริบทของการทำธุรกรรมคุณจะได้รับมูลค่าที่ได้ทำไว้ล่าสุด หากคุณดึงค่าใน session1 อัปเดตใน session2 จากนั้นดึงค่าใน session1 อีกครั้งคุณจะได้รับค่าตามที่แก้ไขใน session2 มันอ่านแถวที่มุ่งมั่นล่าสุด
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Bob
มีเหตุผล?
เพียงคำตอบตามที่ฉันอ่านและทำความเข้าใจกับเธรดนี้และคำตอบ @ remus-rusanu ขึ้นอยู่กับสถานการณ์อย่างง่าย ๆ นี้:
มีสองกระบวนการ A และ B กระบวนการ B กำลังอ่านตาราง X กระบวนการ A กำลังเขียนในตาราง X กระบวนการ B กำลังอ่านอีกครั้งตาราง X
คำถามเก่าที่มีคำตอบที่ยอมรับแล้ว แต่ฉันชอบคิดว่าทั้งสองระดับการแยกในแง่ของวิธีที่พวกเขาเปลี่ยนพฤติกรรมการล็อคใน SQL Server สิ่งนี้อาจเป็นประโยชน์สำหรับผู้ที่กำลังดีบักการหยุดชะงักเช่นเดียวกับฉัน
อ่านแล้วยอมรับ (ค่าเริ่มต้น)
ล็อคที่ใช้ร่วมกันจะถูกนำในการเลือกและปล่อยออกมาแล้วเมื่อเลือกเสร็จสมบูรณ์คำสั่ง นี่คือวิธีที่ระบบสามารถรับประกันได้ว่าไม่มีการอ่านข้อมูลที่ไม่ปราศจากข้อผิดพลาดที่สกปรก การทำธุรกรรมอื่น ๆ ยังคงสามารถเปลี่ยนแถวต้นแบบหลังจากที่ SELECT ของคุณเสร็จสมบูรณ์และก่อนที่ธุรกรรมของคุณจะเสร็จสมบูรณ์
อ่านซ้ำได้
การล็อคที่ใช้ร่วมกันจะถูกนำไปใช้ใน SELECT และจากนั้นจะเปิดตัวหลังจากธุรกรรมเสร็จสมบูรณ์เท่านั้น นี่คือวิธีที่ระบบสามารถรับประกันได้ว่าค่าที่คุณอ่านจะไม่เปลี่ยนแปลงในระหว่างการทำธุรกรรม (เพราะมันจะถูกล็อคจนกว่าการทำธุรกรรมจะเสร็จสิ้น)
พยายามอธิบายข้อสงสัยนี้ด้วยไดอะแกรมอย่างง่าย
อ่านความมุ่งมั่น: ที่นี่ในระดับการแยกนี้ธุรกรรม T1 จะอ่านค่าที่อัพเดตของ X ที่คอมมิทด้วยธุรกรรม T2
อ่านซ้ำได้:ในระดับการแยกนี้ธุรกรรม T1 จะไม่พิจารณาการเปลี่ยนแปลงที่ทำโดยธุรกรรม T2
ฉันคิดว่ารูปภาพนี้มีประโยชน์มันช่วยฉันเป็นข้อมูลอ้างอิงเมื่อฉันต้องการจดจำความแตกต่างระหว่างระดับการแยกอย่างรวดเร็ว (ขอบคุณkudvenkatบน youtube)
โปรดทราบว่าการทำซ้ำในการอ่านที่ทำซ้ำได้เกี่ยวกับ tuple แต่ไม่ถึงทั้งตาราง ในระดับการแยก ANSC, phantom อ่านความผิดปกติสามารถเกิดขึ้นได้ซึ่งหมายความว่าอ่านตารางที่มีเหมือนกันที่ข้อสองครั้งอาจส่งกลับชุดผลลัพธ์ที่แตกต่างผลตอบแทนที่แตกต่างกัน แท้จริงแล้วไม่สามารถทำซ้ำได้
การสังเกตของฉันเกี่ยวกับวิธีแก้ปัญหาที่ยอมรับครั้งแรก
ภายใต้ RR (ค่าเริ่มต้น mysql) - หากเปิด tx และ SELECT ถูกไล่ออกแล้ว tx อื่นไม่สามารถลบแถวใด ๆ ที่เป็นของชุดผลลัพธ์การอ่านก่อนหน้าจนกว่าจะมีการยืนยัน tx ก่อนหน้า (ในความเป็นจริงลบคำสั่งใน tx ใหม่ อย่างไรก็ตาม tx ถัดไปสามารถลบแถวทั้งหมดออกจากตารางได้โดยไม่มีปัญหา Btw การอ่านครั้งต่อไปใน tx ก่อนหน้าจะยังคงเห็นข้อมูลเก่าจนกว่าจะมีการส่งข้อมูล