Deadlock trong hệ quản trị cơ sở dữ liệu: Nguyên nhân, cách phòng tránh và xử lý

Các hệ quản trị cơ sở dữ liệu (DBMS) đảm bảo tính nhất quán (consistency) của dữ liệu, ngăn chặn việc đọc và ghi đồng thời vào cùng một vùng dữ liệu. Điều này có thể dẫn đến hiện tượng các câu lệnh chờ (lock) lẫn nhau. Ví dụ:

  • Lệnh SELECT có thể xung đột với các lệnh UPDATE, INSERT, DELETE vì chúng thay đổi dữ liệu, làm cho kết quả của SELECT không còn chính xác.
  • Các lệnh SELECT thường không khóa lẫn nhau.
  • Các lệnh UPDATE, INSERT, DELETE thường chỉ khóa trên một hàng dữ liệu cụ thể, không khóa toàn bộ bảng. Do đó, nếu các lệnh này tác động đến các hàng khác nhau trong cùng một bảng, chúng có thể thực hiện đồng thời mà không gây ra khóa.

Deadlock là gì?

Mặc dù cơ chế khóa giúp ngăn ngừa sai lệch dữ liệu, nhưng đôi khi nó có thể dẫn đến tình trạng deadlock. Deadlock xảy ra khi hai hoặc nhiều giao dịch (transaction) chờ đợi lẫn nhau để giải phóng tài nguyên mà chúng cần, dẫn đến việc không có giao dịch nào có thể hoàn thành.

Trong điều kiện hoạt động bình thường, một tiến trình sử dụng tài nguyên theo trình tự sau:

  1. Yêu cầu: Tiến trình yêu cầu một tài nguyên. Nếu tài nguyên không sẵn sàng (ví dụ, đang được sử dụng bởi một tiến trình khác), tiến trình phải chờ.
  2. Sử dụng: Tiến trình sử dụng tài nguyên sau khi được cấp phép.
  3. Giải phóng: Tiến trình giải phóng tài nguyên khi hoàn thành.

Deadlock xảy ra khi các tiến trình giữ các tài nguyên mà tiến trình khác cần, và ngược lại, tạo ra một vòng chờ đợi lẫn nhau. Nếu không được giải quyết, deadlock sẽ khiến hệ thống bị “treo” vì không có tiến trình nào có thể tiếp tục.

Ví dụ, giao dịch T1 khóa một số hàng trong bảng students và cần cập nhật dữ liệu trong bảng grades. Đồng thời, giao dịch T2 khóa các bản ghi trong bảng grades mà T1 cần, nhưng lại cần cập nhật các bản ghi trong bảng students mà T1 đang giữ. T1 chờ T2 giải phóng tài nguyên (bảng grades) và T2 chờ T1 giải phóng tài nguyên (bảng students). Vòng chờ đợi này là một deadlock. Hệ quản trị cơ sở dữ liệu (DBMS) cần phát hiện và hủy bỏ một trong các giao dịch để giải quyết tình huống này.

Các biện pháp giảm thiểu Deadlock

Một số kỹ thuật có thể giúp giảm thiểu khả năng xảy ra deadlock:

  • Sử dụng logic nhất quán: Đảm bảo rằng các giao dịch truy cập các bảng theo cùng một thứ tự. Ví dụ: nếu một giao dịch cần truy cập cả bảng studentsgrades, hãy luôn truy cập students trước, sau đó mới đến grades. Trong ví dụ trên, nếu T2 phải chờ T1 giải phóng tài nguyên ở bảng students (vì T1 truy cập students trước), T1 có thể hoàn thành và giải phóng tài nguyên, sau đó T2 mới có thể thực hiện.

Cách phát hiện Deadlock

Các hệ quản trị cơ sở dữ liệu cần có cơ chế để phát hiện deadlock và giải quyết chúng một cách nhanh chóng. Một số phương pháp phát hiện deadlock phổ biến bao gồm:

  • Wait-for graph: Phương pháp này phù hợp với các cơ sở dữ liệu nhỏ. Một biểu đồ được xây dựng, trong đó các nút đại diện cho các giao dịch và các cạnh đại diện cho việc chờ đợi tài nguyên. Nếu biểu đồ có một chu trình (cycle), điều đó có nghĩa là có một deadlock.
  • Wait-Die Scheme và Wound-Wait Scheme: Hai phương pháp này thường được sử dụng trong các cơ sở dữ liệu lớn.

Lưu ý khi sử dụng Transaction

Transaction là một công cụ mạnh mẽ để đảm bảo tính toàn vẹn dữ liệu, nhưng cần được sử dụng một cách cẩn thận:

  • Tránh lạm dụng transaction: Chỉ sử dụng transaction khi thực sự cần thiết để đảm bảo tính nhất quán của dữ liệu.
  • Transaction càng ngắn càng tốt: Giữ cho các transaction ngắn gọn để giảm thời gian khóa tài nguyên và giảm nguy cơ deadlock.

Ví dụ, xét một nghiệp vụ cập nhật thông tin hồ sơ học sinh:

  1. Cập nhật tuổi trong bảng profile.
  2. Cập nhật điểm trong bảng grades.

Mặc dù cả hai hành động này đều liên quan đến việc cập nhật hồ sơ học sinh, nhưng không nhất thiết phải thực hiện chúng trong cùng một transaction. Nếu việc cập nhật điểm không thành công, việc cập nhật tuổi vẫn có thể được giữ lại và thử lại sau. Việc không thực thi đồng thời hai lệnh này không làm sai nghiệp vụ của hệ thống. Rõ ràng trong trường hợp này không cần thiết sử dụng transaction.

Tham khảo: