ระดับการแยก (Isolation Levels)
ระดับการแยก (Isolation levels) กำหนดว่าธุรกรรมหนึ่งจะได้รับการป้องกันจากผลกระทบของธุรกรรมอื่นที่เกิดขึ้นพร้อมกันมากน้อยเพียงใด โดยแลกเปลี่ยนการรับประกันการแยกบางส่วนกับการเพิ่มความพร้อมกัน (concurrency) และปริมาณงาน (throughput) ที่สูงขึ้น
Definition
ระดับการแยก (isolation level) คือข้อกำหนดว่าธุรกรรมอาจสังเกตเห็นความผิดปกติของการทำงานพร้อมกัน (concurrency anomalies) ใดบ้าง โดยระดับที่สูงขึ้นจะป้องกันความผิดปกติได้มากขึ้น (จนถึง serializability เต็มรูปแบบ) โดยมีค่าใช้จ่ายในการลดความพร้อมกัน ในขณะที่ระดับที่ต่ำลงจะอนุญาตให้เกิดความผิดปกติบางอย่างเพื่อแลกกับประสิทธิภาพที่ดีขึ้น
Scope
หัวข้อนี้ครอบคลุมระดับการแยกมาตรฐาน ได้แก่ read uncommitted, read committed, repeatable read และ serializable ซึ่งกำหนดโดยปรากฏการณ์ (dirty read, non-repeatable read, phantom) ที่แต่ละระดับอนุญาตหรือป้องกัน รวมถึงการวิพากษ์วิจารณ์ที่มีอิทธิพลซึ่งได้ปรับกรอบแนวคิดเหล่านี้ในแง่ของความผิดปกติที่อนุญาต และ snapshot isolation ที่มีความสำคัญในทางปฏิบัติและความผิดปกติของมัน เช่น write skew นอกจากนี้ยังกล่าวถึงการแลกเปลี่ยนระหว่างความสอดคล้อง (consistency) และความพร้อมกัน (concurrency) โดยไม่รวมกลไกการล็อก (locking) และ multiversion ที่ใช้ในการนำระดับเหล่านี้ไปปฏิบัติ
Core questions
- ความผิดปกติใดบ้าง — dirty read, non-repeatable read, phantom — ที่แต่ละระดับการแยกอนุญาต?
- มาตรฐาน SQL กำหนดระดับการแยกทั้งสี่อย่างไร?
- เหตุใดนักวิจัยจึงวิพากษ์วิจารณ์คำจำกัดความที่อิงตามความผิดปกติว่ากำกวม?
- snapshot isolation อยู่ในตำแหน่งใด และความผิดปกติใดบ้าง (เช่น write skew) ที่อาจอนุญาต?
- แอปพลิเคชันจะเลือกระดับการแยกสำหรับปริมาณงานที่กำหนดได้อย่างไร?
Key concepts
- read uncommitted
- read committed
- repeatable read
- serializable
- dirty read
- non-repeatable read
- phantom read
- snapshot isolation และ write skew
Key theories
- ระดับการแยกที่อิงตามความผิดปกติ
- มาตรฐาน SQL กำหนดระดับการแยกโดยพิจารณาจากปรากฏการณ์สามอย่าง — dirty reads, non-repeatable reads และ phantoms — ที่อนุญาต โดยมีตั้งแต่ read uncommitted (อนุญาตทั้งหมด) ไปจนถึง serializable (ไม่อนุญาตเลย)
- การวิพากษ์วิจารณ์ระดับการแยกของ ANSI
- Berenson และคณะได้แสดงให้เห็นว่าคำจำกัดความที่อิงตามปรากฏการณ์ของมาตรฐานนั้นกำกวมและไม่สามารถอธิบายระบบ multiversion ได้อย่างชัดเจน และพวกเขาได้นำเสนอ snapshot isolation ในฐานะระดับที่แตกต่างและมีการนำไปใช้อย่างแพร่หลายซึ่งไม่ถูกครอบคลุมโดยคำจำกัดความดั้งเดิม
- Snapshot isolation และความผิดปกติของมัน
- ภายใต้ snapshot isolation แต่ละธุรกรรมจะอ่าน snapshot ที่สอดคล้องกัน ณ เวลาเริ่มต้น ทำให้ได้พฤติกรรมการอ่านที่แข็งแกร่งโดยไม่มีการล็อกการอ่าน แต่ก็สามารถอนุญาตให้เกิดความผิดปกติที่ไม่เป็น serializable ได้ เช่น write skew ซึ่งเป็นแรงจูงใจให้เกิด serializable snapshot isolation
Clinical relevance
ระดับการแยกเป็นทางเลือกในการกำหนดค่าที่ทำเป็นประจำแต่มีความสำคัญสำหรับนักพัฒนาแอปพลิเคชัน: การเลือกระดับที่อ่อนแอเกินไปอาจทำให้ข้อมูลเสียหายโดยไม่รู้ตัวผ่านความผิดปกติที่ละเอียดอ่อน ในขณะที่การใช้ serializable เสมออาจทำให้ปริมาณงานลดลง ดังนั้นการทำความเข้าใจระดับต่างๆ จึงเป็นสิ่งจำเป็นสำหรับการสร้างแอปพลิเคชันธุรกรรมที่ถูกต้องและมีประสิทธิภาพ
History
มาตรฐาน ANSI/ISO SQL ได้กำหนดระดับการแยกในแง่ของปรากฏการณ์ที่อนุญาต การวิพากษ์วิจารณ์ในปี 1995 โดย Berenson, Bernstein, Gray และ O'Neils ได้เปิดเผยความกำกวมในการนิยามเหล่านั้น และได้อธิบายถึง snapshot isolation ซึ่งฐานข้อมูล multiversion กระแสหลักได้นำมาใช้ งานวิจัยในภายหลังได้กำหนด serializable snapshot isolation เพื่อปิดช่องว่างความผิดปกติที่เหลืออยู่
Debates
- การกำหนดการแยกโดยความผิดปกติเทียบกับการกำหนดโดย serializability
- คำจำกัดความที่อิงตามรายการความผิดปกติของมาตรฐานนั้นง่ายต่อการระบุแต่กำกวมและไม่เหมาะกับระบบ multiversion ทางเลือกอื่นคือการกำหนดความถูกต้องโดยตรงผ่าน serializability ซึ่งชัดเจนกว่าแต่ยากที่จะจับคู่กับระดับที่นักพัฒนาตั้งค่าในทางปฏิบัติ
Key figures
- Jim Gray
- Philip Bernstein
- Hal Berenson
Related topics
Seminal works
- berenson1995
- gray1992
Frequently asked questions
- ความแตกต่างระหว่าง non-repeatable read และ phantom read คืออะไร?
- non-repeatable read เกิดขึ้นเมื่อธุรกรรมอ่านแถวเดียวกันสองครั้งและเห็นค่าที่แตกต่างกันเนื่องจากธุรกรรมอื่นได้อัปเดตไปแล้วในระหว่างนั้น ส่วน phantom read เกิดขึ้นเมื่อธุรกรรมเรียกใช้คิวรีซ้ำด้วยเงื่อนไขการค้นหาและเห็นแถวใหม่ที่ธุรกรรมอื่นได้แทรกเข้าไป repeatable read จะป้องกันแบบแรก ส่วน serializable เท่านั้นที่ป้องกัน phantoms ได้อย่างน่าเชื่อถือ
- snapshot isolation เหมือนกับ serializable หรือไม่?
- ไม่เหมือนกัน snapshot isolation ให้แต่ละธุรกรรมมี snapshot ที่สอดคล้องกันและป้องกัน dirty read และ non-repeatable read แต่ไม่เป็น serializable อย่างสมบูรณ์: มันอนุญาตให้เกิดความผิดปกติแบบ write-skew ซึ่งธุรกรรมสองรายการอ่านข้อมูลที่ทับซ้อนกันและทำการอัปเดตที่ไม่เกี่ยวข้องกันซึ่งรวมกันแล้วละเมิดข้อจำกัด serializable snapshot isolation ได้รับการขยายเพื่อกำจัดความผิดปกติเหล่านั้น