ระบบบัญชีขององค์กรแห่งหนึ่งพบปัญหา Phantom Read และ Lost Update เกิดขึ้นบ่อยในช่วงปิดบัญชีประจำเดือน เนื่องจากผู้ใช้หลายคนเข้าถึงและแก้ไขข้อมูลพร้อมกัน แนวทางใดที่เหมาะสมที่สุดในการแก้ไขปัญหาดังกล่าว
กกำหนด Transaction Isolation Level เป็น SERIALIZABLE เพื่อป้องกันทั้ง Phantom Read และ Lost Update โดยให้ธุรกรรมทำงานแบบเรียงลำดับอย่างสมบูรณ์
ขกำหนด Transaction Isolation Level เป็น READ COMMITTED และเพิ่ม Index บนตารางหลักเพื่อเร่งความเร็วในการค้นหาและลดระยะเวลาที่ธุรกรรมใช้ Lock
คใช้ Optimistic Locking ร่วมกับการตั้งค่า Isolation Level เป็น REPEATABLE READ ซึ่งแก้ปัญหา Lost Update ได้แต่ยังคงเกิด Phantom Read ได้อยู่
งแบ่งผู้ใช้ออกเป็นกลุ่มและกำหนดเวลาการใช้งานสลับกัน ร่วมกับการตั้งค่า Isolation Level เป็น READ UNCOMMITTED เพื่อลดการรอ Lock ในช่วงปิดบัญชี
เฉลยอธิบาย
SERIALIZABLE คือระดับ Isolation สูงสุดตามมาตรฐาน SQL ที่สามารถป้องกันได้ทั้ง Dirty Read, Non-Repeatable Read, Phantom Read และ Lost Update เนื่องจากบังคับให้ธุรกรรมทำงานราวกับเรียงลำดับกัน (Serial Execution) ตัวเลือก B แก้ได้เฉพาะ Dirty Read แต่ไม่ป้องกัน Phantom Read และ Lost Update, ตัวเลือก C ใช้ REPEATABLE READ ซึ่งป้องกัน Lost Update ได้แต่ยังเกิด Phantom Read ได้ จึงแก้ปัญหาได้ไม่ครบ, ตัวเลือก D ใช้ READ UNCOMMITTED ซึ่งเป็นระดับต่ำสุดและทำให้ปัญหารุนแรงขึ้น ไม่ใช่การแก้ไข