Deadlock là gì?

Đóng góp bởi: Kovica Tech 220 lượt xem Đăng ngày 14/04/2025 Chia sẻ:

Deadlock: Tình trạng hai (hoặc nhiều) Transactions tranh chấp tài nguyên và block lẫn nhau. Mỗi giao dịch giữ khóa trên tài nguyên mà giao dịch kia cần, khiến không giao dịch nào có thể tiếp tục. Kết quả là tất cả đều chờ nhau vô thời hạn và không tiếp tục được.

I. Kịch bản Deadlock (ví dụ với SQL)

  1. Giao dịch T1: Thực hiện UPDATE trên Bảng A – khóa tài nguyên A.
  2. Giao dịch T2: Thực hiện UPDATE trên Bảng B – khóa tài nguyên B.
  3. Giao dịch T1: Tiếp tục UPDATE trên Bảng B → phải chờ vì B đang bị T2 khóa.
  4. Giao dịch T2: Tiếp tục UPDATE trên Bảng A → phải chờ vì A đang bị T1 khóa.

Hai giao dịch chờ nhau vô thời hạn → Deadlock xảy ra (cả T1 và T2 đều không tiếp tục được được).

Minh họa cụ thể ở hình ảnh:

Transaction A giữ payments và muốn truy cập orders.
Transaction B giữ orders và muốn truy cập payments. => Gây ra deadlock vì hai giao dịch chờ nhau mãi mãi.

What is a Deadlock? ByteByteGo

II. Các điều kiện Coffman (Coffman Conditions) gây ra deadlock:

  • Mutual Exclusion: Ít nhất một tài nguyên ở chế độ không chia sẻ.
  • Hold and Wait: Một tiến trình giữ tài nguyên và chờ tài nguyên khác.
  • No Preemption: Không thể cưỡng chế thu hồi tài nguyên.
  • Circular Wait: Tồn tại chuỗi vòng tròn các tiến trình đang chờ tài nguyên mà các tiến trình khác giữ.

III. Xử lý Deadlock

Một số hệ thống có cơ chế tự động kill session tuy nhiên đối với các hệ thống có lượng session lớn khi xảy ra deadlock các bạn nên chủ động chọn một giao dịch để kill (ROLLBACK) và giải phóng tài nguyên để giao dịch còn lại tiếp tục bình thường. Việc chủ động kill session deadlock sẽ tránh leo thang gây treo hệ thống.

IV. Hạn chế xảy ra deadlock

Bạn có thể chủ động thiết kế để tránh deadlock ngay từ đầu bằng các biện pháp:

  • Thứ tự khóa cố định: Yêu cầu khóa tài nguyên theo cùng một thứ tự xác định trước cho mọi giao dịch, tránh xảy ra vòng tròn chờ.
  • Giới hạn thời gian chờ: Đặt timeout cho việc chờ khóa – nếu một giao dịch chờ quá lâu, hệ thống tự động rollback giao dịch đó để ngăn bế tắc kéo dài.
  • Thuật toán Banker: Sử dụng Banker’s Algorithm để cấp phát tài nguyên an toàn. Thuật toán này đảm bảo hệ thống luôn ở trạng thái “an toàn”, tránh cấp phát dẫn đến deadlock.

Trên đây là một chút tìm hiều của mình về DeadLock. Hi vọng sẽ giúp ích cho mọi người. Cám ơn mọi người đã dành thời gian đọc bài viết, nếu có bất cứ vấn đề gì, đừng ngại thắc mắc dưới phần bình luận, mình cùng nhau chia sẻ kiến thức, cùng nhau nâng cao trình độ.

Chia sẻ bài viết trên:

Bài viết cùng chủ đề: