Locking techniques
@เทคนิคแรกที่สามารถนำมาใช้คือ "เทคนิคการปิดกั้น" (locking techniques) ซึ่งมีแนวคิดที่จะให้มีการปิดกั้นข้อมูลที่อยู่ระหว่างการปรับเปลี่ยนเพื่อป้องกันไม่ให้ผู้ใช้คนอื่นๆเรียกใช้ข้อมูลที่ไม่ถูกต้องไป
shared and exclusive locks
ประเภทของการปิดกั้นข้อมูลจะมีอยู่ 2 ประเภทคือ
- การปิดกั้นแบบร่วม (shared lock หรือ read-lock) คือการปิดกั้นข้อมูลที่จะยอมให้ผู้ใช้คนอื่นเรียกข้อมูลไปอ่านได้ แต่ไม่อนุญาตให้ทำการแก้ไขข้อมูล
-การปิดกั้นแบบเฉพาะ (exclusive lock หรือ write-lock) จะทำการปิดกั้นข้อมูลให้กับผู้ใช้ที่ต้องการเปลี่ยนแปลงข้อมูล โดยผู้ใช้คนอื่นจะไม่มีสิทธิ์ทั้งการเรียกข้อมูลไปอ่านและแก้ไข
Guaranteeing Serializabily by Two-phase Locking
การที่ให้ผู้ใช้ทำการปิดกั้นข้อมูลทั้ง 2 ประเภทตามลักษณะการใช้ข้อมูลของแต่ละคน ก็ยังไม่สามารถแน่ใจได้ว่าทุก transaction จะเกิดคุณสมบัติ serializable เทคนิคที่จะนำมาใช้ในการปิดกั้นเพื่อแก้ปัญหานี้ก็คือ Two-phase Locking (2pl) โดยจะแบ่ง transaction ออกเป็น 2 ระยะคือ
- expanding (or growing) phase เป็นระยะที่มีเฉพาะการทำรายการปิดกั้นข้อมูลที่ต้องการเท่านั้น จะไม่มีการปล่อยการปิดกั้นข้อมูลใดๆ
- shrinking phase เป็นระยะที่จะปลดปล่อยข้อมูลที่ได้ปิดกั้นไว้ และจะไม่มีการปิดกั้นข้อมูลอื่นๆเพิ่มเติม
หลักการของ 2pl ก็คือ transaction ใดๆก็ตาม การปิดกั้นข้อมูลทุกรายการ(ทั้ง read-lock และ write-lock ) จะต้องทำก่อนการปล่อยข้อมูลครั้งแรกใน transaction นั้นๆ
พิจารณาลำดับการทำงานของ transaction X และ transaction Y
transaction X |
transaction Y |
read-lock (a); read ค่า a; unlock (a); write-lock (b); read ค่า b; b = b + a; unlock (b); |
read-lock (b); read ค่า b; unlock (b); write-lock (a); read ค่า a; a = a + b; unlock (a); |
จะเห็นว่าการปิดกั้นข้อมูลของทั้ง 2 transaction ไม่ได้เป็นไปตามหลักการของ 2pl คือมีรายการ lock ข้อมูลซึ่งเกิดหลังจากการ unlock ข้อมูล หากกำหนดค่าเริ่มต้นให้ a = 20 และ b = 30 แล้ว ผลลัพธ์จากลำดับที่เป็น serial ก็คือ a = 50, b = 80 (ในกรณีที่ Y ทำก่อน X ) หรือ a = 70, b = 50 (กรณีที่ X ทำก่อน Y ) แต่ผลลัพธ์จากลำดับ nonserial ตามตารางด้านล่างจะได้เป็น a = 50, b = 50 ซึ่งไม่ตรงกับลำดับที่เป็น serial
transaction X | time | transaction Y |
read-lock (a); read ค่า a; unlock (a); |
t1 |
|
t2 |
read-lock (b); read ค่า b; unlock (b); write-lock (a); read ค่า a; a = a + b; unlock (a); |
|
write-lock (b); read ค่า b; b = b + a; unlock (b); |
t3 |
ดังนั้นหากจะให้แน่ใจว่าลำดับการทำงานจะเกิดคุณสมบัติ serializable จะต้องจัดลำดับการ lock และ unlock ของทั้ง 2 transaction ตามหลักการของ 2pl ได้ดังนี้
transaction X | transaction Y |
read-lock (a); read ค่า a; write-lock (b); unlock (a); read ค่า b; b = b + a; unlock (b); |
read-lock (b); read ค่า b; write-lock (a); unlock (b); read ค่า a; a = a + b; unlock (a); |