kkkkkkkkkkkkkkkk
KKỹỹ thuthuậậtt khóakhóa NguyênNguyên ttắắcc ccủủaa kkỹỹ ththậậtt khóakhóa Trước khi một giao tác muốn thao tác (ñọc/ghi) lên một ñơn vị dữ liệu A, thì T phải phát ra yêu cầu xin khóa A (Lock(A)) gởi ñến bộ phận cấp phát khóa (Lock Manager)phát khóa (Lock Manager) Nếu yêu cầu xin khóa ñược chấp thuận, thì T mới ñược thao tác lên A, ngược lại thì T phải chờ Sau khi thao tác xong với một ñơn vị dữ liệu A, giao tác T, phải phát ra lện giải phóng A (Unlock(A)) NguyênNguyên ttắắcc ccủủaa kkỹỹ thuthuậậtt khóakhóa Một yêu cầu xin khóa một ñơn vị dữ liệu A, chỉ ñược bộ cấp phát khóa chấp thuận nếu A chưa bị khóa bởi một giao tác nào khác ( khóa bởi một giao tác nào khác ( A ñang tự do) NhNhậậnn xétxét Khi sử dụng kỹ thuật khóa, các vấn ñề bất thường trong truy xuất ñồng thời không thể xãy xa Ví dụ : vấn ñề mất dữ liệu ñã cập Ví dụ : vấn ñề mất dữ liệu ñã cập nhật VíVí ddụụ T1 T2 Lock(A) Lock(A) Chờ Read(A) A=A+10A=A+10 Write(A) Unlock(A) Lock(A) Read(A) A=A+20 Write(A) Unlock(A) CácCác vvấấnn ññềề ccủủaa kkỹỹ thuthuậậtt khóakhóa Vấn ñề khóa sống (Live Lock) T1 T2 Lock(A) Read(A) Lock(A)Lock(A) Chờ Unlock(A) Các giao tác khác Lock(A) Lock(A) Tiếp tục chờ CácCác vvấấnn ññềề ccủủaa kkỹỹ thuthuậậtt khóakhóa Vấn ñề khóa chết (Dead Lock) T1 T2 Lock(A) Lock(B) Lock(B)Lock(B) Chờ Lock(A) Chờ GiGiảảii quyquyếếtt vvấấnn ññềề khóakhóa chchếếtt Ngăn ngừa khóa chết Mọi giao tác T phải xin khóa tất cả các ñơn vị dữ liệu mà mình sẽ thao tác, nếu ñược chấp thuận tất cảtác, nếu ñược chấp thuận tất cả thì sẽ thao tác, ngược lại phải giải phóng các khóa ñã ñược cấp trên các ñơn vị dữ liệu GiGiảảii quyquyếếtt vvấấnn ññềề khóakhóa chchếếtt Phát hiện khóa chết ◦ Xây dựng ñồ thị chờ (Waiting Graph) G Mỗi giao tác T i là một nút của ñồ thị G N u có giao tác T phát ra yêu c u khóa Nếu có giao tác T j phát ra yêu cầu khóa ñươn vị dữ liệu A, và phải chờ do A ñã bị khóa trước ñó bởi một giao tác T i , thì vẽ cung nối T i ,T j (biểu diễn việc T j phải chờ T i Nếu G xuất hiện chu trình => khóa chết xãy ra KKỹỹ thuthuậậtt khóakhóa ññọọcc//viviếếtt Trước khi ñọc ñ.v.d.l A phải yêu cầu xin khóa A ñể ñọc Read_Lock(A) Trước khi viết lên ñ.v.d.l A phải yêu Trước khi viết lên ñ.v.d.l A phải yêu cầu xin khóa A ñể viết Write_Lock(A) Sau khi thao tác xong với ñ.v.d.l A, phải giải phóng A Unlock(A)