ลัำกษณะการทำงานของ lock-based technique
- Lock primitive
ถ้าเราทำ x-lock (wlock) จะได้ทั้งสิทธิ์ read & write
ถ้า s-lock (share lock) จะทำได้แค่ read
- Lock Compatibility Matrix
ซึ่งหมายถึงถ้าเรา ทำ slock กับข้อมูลใดๆ คนอื่นสามารถเข้ามาทำ slock กับข้อมูลนั้นๆ ได้
- Lock protocol คือลำดับขั้นตอนในการใช้คำสั่ง lock และ unlock ซึ่ง DBMS ในปัจจุบันจะใช้ Two-Phase Locking Protocal
Two-Phase locking มี 2 phase คือ
1. Growing phase: transaction จะ lock ได้ แต่ละ ปลด lock ไม่ได้
2. Shrinking phase: transaction จะปลด lock ได้ แต่จะ lock ข้อมูลเดิมอีกไม่ได้
lock-based technique นี้ รับประกัน conflict serializability ดังนั้นจะไม่เกิดปัญหา lost update และ inconsistent analysis แต่ว่ายังพบปัญหา uncommitted dependency และ phantom phenomenon ดังนั้นจึงมีการพัฒนา protocol ที่จะใช้เพิ่มขึ้นเป็น
strict two-phase locking protocol ซึ่งจะทำ shrink phase ที่ sync point เท่านั้น (จุดที่ commit transaction) ดังนั้น
strict two-phase locking protocol จะแก้ปัญหา uncommitted dependency ได้ด้วย
การที่ใช้ protocol นี้ทำให้
1. lost update เป็น dead lock
T1 | T2 |
---|
read(A) (acquire s-lock on A) |
| read(A) (acquire s-lock on A) |
update(A) (acquire x-lock) |
|
wait
| update(A) (acquire x-lock |
wait | wait |
... | ... |
2. uncommitted dependency ไม่เกิดขึ้น
3. inconsistent analysis เป็น dead lock
4. phantom phenomenon ยังคงเกิดขึ้น
ปัญหาที่เกิดขึ้นบ่อยที่สุด คือ lost update ซึ่งวิธีการแก้ไข ที่ไม่ให้เกิด dead lock บน lost update ได้ สามารถทำได้ง่ายๆ โดยแทนที่จะ ขอ s-lock ในตอนแรกที่ read ให้ขอเป็น x-lock แทน
นอกจากนั้นปัญหาที่เกิด dead lock บน inconsistent analysis จะต้องใช้ multiple granularity คือแทนที่จะ lock เฉพาะข้อมูลที่จะ read ก็ lock ในระดับ table เลย โดยดูจากคำสั่ง เช่น select sum(amount) from account ก็จะ lock ทั้ง table account เลย ซึ่งทำให้แก้ปัญหาของ phantom phenomenon ได้ด้วย
เปรียบเทียบกับ isolation ถ้าเป็น repeatable read หรือ serializable จะเป็น strict two-phase locking protocol + multiple granularity
แต่การทำ granularity นั้น ยิ่ง lock ในหน่วยเล็ก ก็จะยิ่งเพิ่มงานให้กับ DBMS เช่นการ lock record ก็จะทำให้เกิดงานกับ DBMS มากกว่า lock table ดังนั้นจึงมีเทคนิคการ
lock escalation หรือ
lock promotion คือ DBMS จะดูว่า ณ.ขณะนั้นเหมาะสมที่จะ lock ในระดับใด เช่น ถ้าในขณะนั้น มี user คนเดียว login อยู่ ก็จะ lock ทั้ง DB เลย หรือถ้ามี user คนเดียวใช้ table นั้นๆ อยู่ ก็จะ lock ที่ table
แต่การที่ DBMS จะรู้ว่า ระดับไหนมี transaction ใดใ้ช้อยู่ ก็โดยการใช้
Intend locking โดยเพิ่ม mode การ locking เพิ่มขึ้นไปอีก 3 mode
1.
intention-shared (IS) ถ้า node ที่เล็กกว่าถูก s-lock node นั้นก็จะเป็น IS เช่น ถ้า มี table มีการ s-lock ที่ record ใด record หนึ่ง table นั้นก็จะเป็น IS
2.
intention-excusive (IX) ถ้า node ที่เล็กว่า ถูก x-lock node นั้นก็จะเป็น IX
3.
shared and intention-exclusive (SIX) คือ การ share เพื่อที่จะ update เช่นการ update a = a + 1
| IS | IX | S | SIX | X |
---|
IS | true | true | true | true | false |
---|
IX | true | true | false | false | false |
---|
S | true | false | true | false | false |
---|
SIX | true | false | false | false | false |
---|
X | false | false | false | false | false |
---|
นอกจากนั้น DB2 ยังมีสองแบบ แบบแรกคือ
Cursor stability คือจะ lock เฉพาะที่ cursor อยู่เท่านั้น (ซึ่งเหมือนกับ read uncommitted) อีกแบบคือ
Degree-two consistency คือ result ทั้งหมด จะถูก lock ไว้ เมื่อเลื่อน cursor ไปข้างหน้า record ที่ผ่านมา ก็จะถูกปลด lock ไปแต่ละครั้งที่เลื่อน record ไป ซึ่งผลที่ได้ก็จะเป็น read committed