คุณถาม
ข้อมูลที่ไม่ได้รับการจัดเก็บอยู่ที่ไหนเช่นธุรกรรม READ_UNCOMMITTED สามารถอ่านข้อมูลที่ปราศจากข้อผูกมัดจากธุรกรรมอื่นได้หรือไม่
ในการที่จะตอบคำถามของคุณคุณจำเป็นต้องรู้ว่าสถาปัตยกรรมของ InnoDB เป็นอย่างไร
รูปต่อไปนี้ถูกสร้างขึ้นเมื่อหลายปีก่อนโดย Percona CTO Vadim Tkachenko
ตามเอกสาร MySQL ในรูปแบบการทำธุรกรรม InnoDB และการล็อค
COMMIT หมายถึงการเปลี่ยนแปลงที่เกิดขึ้นในการทำธุรกรรมในปัจจุบันนั้นเป็นการถาวรและสามารถมองเห็นได้ในช่วงอื่น ๆ ในทางกลับกันคำสั่ง ROLLBACK ยกเลิกการแก้ไขทั้งหมดที่ทำโดยการทำธุรกรรมปัจจุบัน ทั้ง COMMIT และ ROLLBACK ปล่อยการล็อค InnoDB ทั้งหมดที่ตั้งค่าไว้ระหว่างการทำธุรกรรมปัจจุบัน
เนื่องจาก COMMIT และ ROLLBACK ควบคุมการเปิดเผยข้อมูลดังนั้น READ COMMITTED และ READ UNCOMMITTED จึงต้องอาศัยโครงสร้างและกลไกที่บันทึกการเปลี่ยนแปลง
- ส่วนย้อนกลับ / เลิกทำพื้นที่
- ทำซ้ำบันทึก
- Gaps Locks เทียบกับตารางที่เกี่ยวข้อง
เซ็กเมนต์ Rollback และ Undo Space จะทราบว่าข้อมูลที่เปลี่ยนแปลงมีลักษณะอย่างไรก่อนที่จะมีการเปลี่ยนแปลง บันทึกการทำซ้ำจะรู้ว่าการเปลี่ยนแปลงใดที่จะถูกนำไปใช้เพื่อให้มีข้อมูลอัปเดตปรากฏขึ้น
คุณยังถาม
เหตุใดจึงเป็นไปไม่ได้ที่ธุรกรรม READ_COMMITTED ในการอ่านข้อมูลที่ไม่มีข้อผูกมัดเช่นกำลังทำการ "อ่านสกปรก" กลไกอะไรบังคับใช้ข้อ จำกัด นี้
บันทึกการทำซ้ำเลิกทำพื้นที่และแถวที่ถูกล็อค คุณต้องพิจารณาว่า InnoDB Buffer Pool (ซึ่งคุณสามารถวัดหน้าสกปรกด้วยinnodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirtyและinnodb_buffer_pool_bytes_dirty )
ด้วยเหตุนี้ผู้อ่านที่ได้รับการยอมรับจะรู้ว่าข้อมูลใดที่ปรากฏอย่างถาวร ดังนั้นจึงไม่จำเป็นต้องค้นหาหน้าสกปรกที่ไม่ได้กระทำ ความมุ่งมั่นในการอ่านจะไม่มีอะไรมากไปกว่าการอ่านที่สกปรกที่ได้กระทำไปแล้ว อ่าน UNCOMMITTED จะยังคงรู้ว่าแถวใดที่จะถูกล็อคและสิ่งที่บันทึกการทำซ้ำได้อ่านหรือละเว้นเพื่อให้ข้อมูลที่มองเห็น
เพื่อให้เข้าใจการล็อกแถวเพื่อจัดการแยกอย่างสมบูรณ์โปรดอ่านรูปแบบการทำธุรกรรมและการล็อค InnoDB