- การอ่านที่สกปรก : อ่านข้อมูลที่ไม่ได้รับคำสั่งจากธุรกรรมอื่น
- ไม่สามารถอ่านซ้ำได้ : อ่านข้อมูล COMMITTED จาก
UPDATE
แบบสอบถามจากธุรกรรมอื่น
- Phantom อ่าน : อ่านข้อมูล COMMITTED จาก
INSERT
หรือDELETE
แบบสอบถามจากธุรกรรมอื่น
หมายเหตุ : คำสั่ง DELETE จากธุรกรรมอื่นยังมีโอกาสน้อยมากที่ทำให้อ่านไม่ได้ซ้ำในบางกรณี มันเกิดขึ้นเมื่อคำสั่ง DELETE โชคไม่ดีที่จะลบแถวเดียวกันซึ่งธุรกรรมปัจจุบันของคุณถูกสืบค้น แต่นี่เป็นกรณีที่เกิดขึ้นได้ยากและไม่น่าจะเกิดขึ้นในฐานข้อมูลที่มีแถวเป็นล้านในแต่ละตาราง ตารางที่มีข้อมูลธุรกรรมมักมีปริมาณข้อมูลสูงในสภาพแวดล้อมการผลิตใด ๆ
นอกจากนี้เราอาจสังเกตว่าการอัปเดตอาจเป็นงานที่บ่อยขึ้นในกรณีการใช้งานส่วนใหญ่มากกว่า INSERT หรือ DELETES จริง (ในกรณีเช่นนี้, อันตรายจาก การอ่านที่ไม่สามารถทำซ้ำได้ยังคงอยู่เท่านั้น - การอ่าน phantomไม่สามารถทำได้ในกรณีเหล่านั้น) นี่คือสาเหตุที่การอัปเดตได้รับการปฏิบัติแตกต่างจาก INSERT-DELETE และความผิดปกติที่เกิดขึ้นก็มีชื่อแตกต่างกันเช่นกัน
นอกจากนี้ยังมีค่าใช้จ่ายในการประมวลผลเพิ่มเติมที่เกี่ยวข้องกับการจัดการสำหรับ INSERT-DELETE แทนที่จะเป็นเพียงแค่จัดการ UPDATES
- READ_UNCOMMITTED ป้องกันอะไรเลย มันเป็นระดับการแยกศูนย์
- READ_COMMITTED ป้องกันเพียงหนึ่งเดียวนั่นคือ Dirty reads
- REPEATABLE_READ ป้องกันความผิดปกติสองอย่าง: อ่านสกปรกและอ่านซ้ำไม่ได้
- SERIALIZABLE ป้องกันความผิดปกติทั้งสาม: อ่านสกปรกอ่านซ้ำไม่ได้และอ่าน Phantom
ถ้าเช่นนั้นทำไมไม่เพียง แต่ตั้งค่าการทำรายการให้เป็นอิสระตลอดเวลา? คำตอบสำหรับคำถามข้างต้นคือ: การตั้งค่าที่ปรับให้เหมาะสมทำให้การทำธุรกรรมช้ามากซึ่งเราไม่ต้องการอีกครั้ง
ในความเป็นจริงการใช้เวลาธุรกรรมอยู่ในอัตราต่อไปนี้:
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
ดังนั้นการตั้งค่า READ_UNCOMMITTED เป็นเร็วที่สุด
สรุป
ที่จริงแล้วเราจำเป็นต้องวิเคราะห์กรณีการใช้งานและตัดสินใจระดับการแยกเพื่อให้เราเพิ่มประสิทธิภาพเวลาการทำธุรกรรมและยังป้องกันความผิดปกติส่วนใหญ่
โปรดทราบว่าฐานข้อมูลโดยค่าเริ่มต้นจะมีการตั้งค่า REPEATABLE_READ