SQL: Transaction Isolation (2009-04-01)
SQL: Transaction Isolation
Transaction Isolation เรียกแบบง่ายๆน่าจะหมายถึงระดับการล๊อกการเข้าถึงของมูลของดาตาเบส
แบ่งได้เป็น 4 ระดับ
ก่อนจะดูว่าแต่ละระดับ นั้นเป็นอย่างไรเรามาดูความหมายของของอาการต่างๆ ที่เกิดขึ้นจากระดับการล๊อก

กำหนดให้
T1 หมายถึง Transaction ที่ 1
T2 หมายถึง Transaction ที่ 2
Dirty Read
คือการอ่านข้อมูลที่ยังไม่ Commit ได้
เช่น
Begin T1
Begin T2
T1.Select * -- Select ครั้งที่ 1
T2.Update
T1.Select * -- Select ครั้งที่ 2
T2.Commit
T1.Commit
จะเห็นว่าการ Select ครั้งที่ 1 และ 2 นั้นผลไม่เหมือนกัน แม้ว่า T2 ยังไม่ Commit ก็ตาม
ถ้าเกิด T2 มัน มี error แล้วเราก็ Rollback มันซะแล้วอ่านอีกครั้งค่ามันก็จะเหมือนกับการอ่านครั้งแรก
ง่ายๆ Dirty Read คืออ่านอะไรที่ไม่ชัวร์ออกมา เหมือนอ่านรูป slot machine ที่กำลังหมุนอยู่แล้วก็เอามาใช้ ทั้งๆที่ต้องรอให้มันหยุดนิ่งก่อน
Repeatable Read
คือ อ่านแล้ว มีตัวอื่นมาอับเดทและคอมมิท แล้วอ่านอีกทีก็ได้ค่าเหมือนเดิม
เช่น
Begin T1
Begin T2
T1.Select * -- Select ครั้งที่ 1
T2.Update
T2.Commit
T1.Select * -- Select ครั้งที่ 2
T1.Commit
จะเห็นว่าการ Select ครั้งที่ 1 และ 2 นั้นได้ผลเหมือนกัน แม้ข้อมูลถูกเปลี่ยนแปลงไปแล้วก็ตาม
NonRepeatable Read
คือ อ่านแล้ว มีตัวอื่นมาอับเดทและคอมมิท แล้วอ่านอีกทีก็ได้ค่าไม่เหมือนเดิม
Phantom Read
คือ อาการผีโผล่มาจากไหน คือเราคาดหวังว่าเป็น Repeatable Read แต่อ่านอีกครั้งค่าไม่เปลี่ยน แต่กลับมีค่าใหม่โผล่ขึ้นมา คือจำนวน row ที่อ่านได้เพิ่มขึ้น เพราะผลจาก insert
ต่อมาก็มาดูถึง Isolation Level ไล่จากระดับอ่อนสุดไปถึงเข้มสุด
1. Read Uncommitted
มันก็เหมือนการ select * from Table with (nolock)
มันจะเกิดอาการ Dirty Read อ่านอะไรที่ไม่ชัวร์ออกมา
2. Read Committed
จะอ่านค่าได้เฉพาะข้อมูลที่ Committed แล้วเท่านั้น จะเกิดอาการ Nonrepeatable Read และ Phantom Read ได้
3. Repeatable Read
อ่านแล้วคอมมิทอ่านอีกก็ได้แบบเดิม แต่จะเกิด Phantom Read ได้
ทำ ไม่มันอ่านได้เหมือนเดิม เพราะข้อมูลที่ถูกอ่านครั้งแรกนั้นมันจะรู้ว่าตัวไหนถูกอ่านมาบ้าง โดยดูจาก condition where แล้วคราวนี้ถ้ามีตัวอื่นพยายามจะอับเดทข้อมูลที่ข้อมูลอยู่ใน where อันแรกมันจะค้างไม่ update ให้และรอจะกว่า transaction แรกจะ commit ถึงจะทำการ update ให้ แต่เรายัง insert ข้อมูล ถ้าข้อมูลใหม่ไปตรงกับ where อันแรก อ่านมาอรกครั้งผลก็จะไม่เหมือนเดิม(Phantom Read)
4. Serializable
มีค่าเท่ากับ Holdlock
เป็น ระดับที่เข้มงวดสุดจะไม่เกิดอาการ Dirty Read, Nonrepeatable Read, Phantom Read เพราะอะไรนั้น เพราะมันจะใช้ lock แบบต่างๆ ทำให้ Transaction อื่นๆยังใช้งานข้อมูลไม่ได้ต้องรอให้ Transaction ที่ถือ lock นั้นทำงานเสร็จก่อน ซึ่ง Lock ต่างๆจะอธิบายในคราวหน้า
แต่การเซต Isolation Level ที่เข้มงวดมากนั้นจะเกิดปัญหาการเข้าถึงข้อมูล อาจทำให้เกิด deadlock ได้ถ้าจัดการไม่ดี ในคราวหน้าจะพูดถึงรูปแบบการเกิดและวิธีจัดการ deadlock
| Create Date : 07 มีนาคม 2549 |
| Last Update : 7 มีนาคม 2549 15:39:40 น. |
|
|
ขอบคุณที่มา http://www.bloggang.com/viewdiary.php?id=chaizzz&month=03-2006&date=07&group=1&gblog=9
|