Các hệ quản trị cơ sở dữ liệu có vai trò đảm bảo tính nhất quán cho các tài nguyên trong database nhưng lại vô tình dẫn đến sự xuất hiện của tình trạng lock lẫn nhau giữa các câu lệnh. Và Deadlock chính là định nghĩa cho sự xung đột giữa các câu lệnh khi mà trong cùng một thời điểm cùng đọc hay ghi một dữ liệu.
Hiểu rõ định nghĩa Deadlock là gì cũng như các kiến thức liên quan đến Deadlock trong bài viết mà Bizfly Cloud chia sẻ chính là cách để bạn giảm thiểu khả năng xảy ra Deadlock.
Deadlock là gì?
Deadlock là hiện tượng mà một hay nhiều lệnh trong database tranh chấp tài nguyên với nhau mà trong đó một lệnh giữ tài nguyên mà lệnh còn lại cần. Điều này dẫn đến việc không có lệnh nào có thể kết thúc để tiến hành giải phóng tài nguyên. Nếu hiện tượng này không được xử lý thì sẽ xuất hiện tình trạng các câu lệnh phải chờ nhau và tất nhiên không một tiến trình nào có thể được thực hiện tiếp.
Giả sử:
- Transaction T1 thực hiện lock một số hàng trong bảng student và cần thiết phải cập nhật một số hàng khác trong bảng Grades.
- Transaction T2 lock trên những bản ghi mà Transaction T1 cần cập nhật trong bảng Grades nhưng phải cập nhật các bản ghi có trong bảng students do Transaction T1 nắm giữ.
Điều này dẫn đến vấn đề phát sinh đó là:
- Transaction T1 chờ Transaction T2 giải phóng tài nguyên.
- Transaction T2 cũng chờ Transaction T1 giải phóng tài nguyên.
Kết quả thu được là mọi hoạt động trong cơ sở dữ liệu đều dừng lại và tồn tại mãi mãi cho đến khi deadlock được phát hiện và được tiến hành hủy bỏ trong Transaction T1 hoặc trong Transaction T2.
Những sai lệch khi bạn thao tác với database thường để lại những hậu quả vô cùng nghiêm trọng và lock chính là một chiến lược tối ưu có thể ngăn chặn được hiện tượng này. Tuy nhiên, Deadlock lại hoàn toàn khác biệt bởi nó sẽ dẫn đến việc không một câu lệnh nào có thể được thực hiện.
Dưới chế độ điều hành thông thường, tài nguyên chỉ được sử dụng theo môt quá trình với thứ tự như sau:
- Yêu cầu: Nếu các yêu cầu không được gán một cách tức thì thì quá trình đang yêu cầu phải chờ cho đến khi nhận được tài nguyên thì mới có thể tiếp tục tiến trình.
- Sử dụng: Quá trình điều hành tài nguyên.
- Giải phóng: Quá trình có thể giải phóng tài nguyên.
Cách giảm khả năng xảy ra Deadlock
Một phương pháp tối ưu nhất mà bạn có thể sử dụng để giảm khả năng xảy ra Deadlock chính là sử dụng logic nhất quán trong toàn bộ ứng dụng. Giả sử Transaction luôn phải truy cập vào các bảng student và grades theo cùng một thứ tự nhất định.
Nếu thứ tự truy cập cố định của hai bảng là từ student đến grades thì T2 sẽ phải chờ T1 thực hiện việc giải phóng tài nguyên từ bảng student rồi mới được bắt đầu (T2 chưa lock tài nguyên của bảng grades). Vì vậy, T1 cần được thực hiện một cách bình thường rồi thì T2 mới được thực hiện để tránh xảy ra tình trạng Deadlock.
Cách phát hiện Deadlock
Các cơ sở dữ liệu khi muốn ngăn chặn triệt để tình trạng Deadlock xảy ra và dẫn đến việc hệ thống bị trì trệ quá lâu thì cần phải có phương pháp phát hiện Deadlock hiệu quả. Thậm chí, trong nhiều trường hợp, cơ sở dữ liệu cần phải theo dõi tiến trình lock dữ liệu cho dù tiến trình đó có xảy ra Deadlock hay không.
Và phương pháp tối ưu nhất để phát hiện Deadlock mà các cơ sở dữ liệu có thể sử dụng chính là Wait for graph. Phương pháp này sẽ vẽ một biểu đồ dựa trên Transaction và lock chúng trên tài nguyên. Nếu đồ thị được Wait for graph tạo ra một chu kỳ hay một vòng tròn khép kín thì chắc chắn sẽ có một Deadlock xảy ra.
nếu cơ sở dữ liệu của bạn quá lớn thì hai phương pháp khác mà bạn có thể áp dụng là Wound Wait Scheme và Wait Die Scheme.
Một vài số lưu ý sử dụng Transaction
Khi sử dụng Transaction, bạn cần phải hiểu ý nghĩa của nó một cách rõ ràng và tránh lạm dụng chúng. Yếu tố quan trọng nhất của Transaction là đảm bảo chuỗi câu lệnh. Nếu một câu lệnh không được hoàn thành thì toàn bộ Transaction sẽ không được hoàn thành. Nếu xuất hiện một nghiệp vụ cập nhật thông tin hồ sơ bao gồm:
- Lệnh 1: Cập nhật tuổi trong bảng Profile
- Lệnh 2: Cập nhật điểm trong bảng Grades
Thì bạn cần thực hiện cả hai hành động tương ứng với hai nghiệp vụ nói trên. Tuy nhiên, điều này không có nghĩa là lệnh 1 không được thực hiện khi lệnh 2 không thực hiện thành công. Bởi ngay sau khi hoàn tất bạn hoàn toàn có khả năng kiểm tra hiệu quả thực thi lệnh 1 và tiến hành thực thi lệnh 2. Do đó, việc không thực thi cùng lúc hai lệnh trên sẽ không làm sai nghiệp vụ của hệ thống. Ngoài ra, bạn cần lưu ý:
- Transaction càng ngắn thì càng đạt được hiệu quả tốt.
- Tránh sử dụng Transaction một cách tối đa.
Deadlock xảy ra mang đến cho cơ sở dữ liệu một mớ những rắc rối và hỗn độn khi các dữ liệu trong hệ thống phải chờ nhau giải phóng dẫn đến tình trạng trì trệ hệ thống. Nắm rõ khái niệm Deadlock là gì cũng như cách phát hiện và cách giảm khả năng xảy ra Deadlock trong bài viết của Bizfly Cloud chắc chắn sẽ giúp hệ thống cơ sở dữ liệu của bạn được giải phóng tài nguyên và hoạt động trơn tru, liên tục.