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);

1