Khóa “cứng” (deadlock)

Một phần của tài liệu bài giảng về cơ sở dữ liệu nâng cao (Trang 32 - 33)

Một vấn đề khác có thể xẩy ra trong điều khiển các hoạt động đồng thời, đó là vấn đề khóa “cứng” (deadlock). Đó là các giao dịch khóa chéo lẫn nhau các mục cần để hoàn thiện giao dịch.

Ví dụ:

T1: begin T2:begin Lock A Lock B Unlock A Unlock B end Lock B Lock A Unlock B Unlock A end

Giả sử T1 và T2 được thực hiện cùng lúc. T1 yêu cầu khóa A và được trao quyền khóa trên A, còn T2 yêu cầu và được trao quyền khóa trên B. Do đó khi T1 yêu cầu khóa trên B thì nó phải đợi

vị T2 đã khóa B. Tương tự khi T2 yêu cầu khó trên A, nó cũng buộc phải đợi vì T1đã khóa A. Kết

quả là không một giao dịch nào tiếp tục hoạt động được, mỗi giao dịch đều phải đợi cho giao dịch

kia mở khóa, và chúng đều phải đợi nhưng chẳng bao giờ nhận được khó như yêu cầu.

Như vậy khóa “cứng” là một tình huống mà trong đó mỗi thành viên Ti của một tập giao dịch T

= {T1, T2,…, TN} đang đợi nhận khóa của một mục hiện đang bị khóa bởi một giao dịch khác trong

tập T. Bởi vì mỗi giao dịch trong tập T đều đang đợi, nói không thể mở khóa cho mục mà một giao

dịch khác đang cần, vì vậy tất cả vẫn tiếp tục đợi mãi mãi. Một số giải pháp cho vấn đề khóa “cứng”:

1. Yêu cầu các giao dịch phải đưa tất cả mọi yêu cầu khóa cùng một lúc, và bộ quản lý khóa trao

tất cả các khóa cho chúng nếu được, hoặc không trao và cho giao dịch này đợi nếu một hay nhiều khóa đang được giữ bởi một giao dịch khác.

2. Gán một thứ tự tuyến tính cho các mục, buộc tất cả các giao dịch phải xin khóa theo thứ tự

này.

Một cách khác nhằm xử lý các khóa “cứng” là không ngăn cản chúng. Và cứ sau mỗi khoảng

thời gian nhất định ,hệ thống sẽ kiểm tra yêu cầu khóa và tìm xem có xảy ra khóa “cứng” hay

không. Nếu chúng ta sử dụng đồ thị chờ đợi, với các nút là cá giao dịch và các cung T1  T2 biểu

thị cho T2 đang đợi nhận khóa trên một mục đang được T1 giữ. Thế thì mỗi chu trình trongđồ thị

chờ sẽ biểu thị cho một khóa “cứng”, và nếu không có chu trình thì kết luật là không có khóa

“cứng”. Nếu một khóa “cứng” được phát hiện, thì hệ thống phải khởi động lại và các tác dụng trên

CSĐL của giao dịch khóa “cứng” đó phải bỏ đi. Quá trình hủy bỏ và tái khởi động có thể gặp rắc

rối nếu chúng ta không biết được cách thức các giao dịch ghi vào CSDL trước khi chúng hoàn thành.

Một phần của tài liệu bài giảng về cơ sở dữ liệu nâng cao (Trang 32 - 33)