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.