Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

01

Lỗ hổng Race Condition là gì? Phân biệt cơ chế khóa lạc quan (Optimistic Locking) và khóa bi quan (Pessimistic Locking) khi xử lý bất đồng bộ?

Senior

Race Condition xảy ra khi nhiều tiến trình/luồng đồng thời đọc và ghi vào một tài nguyên dùng chung mà không được đồng bộ hóa, dẫn đến kết quả cuối cùng phụ thuộc vào thứ tự thực thi ngẫu nhiên của các luồng.

  • Pessimistic Locking (Khóa bi quan): Giả định xung đột luôn xảy ra. Khi một luồng đọc dữ liệu, nó sẽ khóa ngay bản ghi đó lại (ví dụ: SELECT ... FOR UPDATE trong SQL). Các luồng khác muốn đọc/ghi bản ghi đó bắt buộc phải xếp hàng chờ cho đến khi khóa được giải phóng.
    • Ưu điểm: Đảm bảo tính nhất quán tuyệt đối, tránh hoàn toàn xung đột.
    • Nhược điểm: Dễ gây nghẽn hệ thống (lock contention), giảm hiệu năng và có nguy cơ xảy ra Deadlock.
  • Optimistic Locking (Khóa lạc quan): Giả định xung đột rất hiếm khi xảy ra. Khi đọc dữ liệu, không có khóa nào được thiết lập. Nhưng bản ghi sẽ lưu thêm một trường version hoặc timestamp. Khi ghi đè thay đổi, hệ thống kiểm tra xem version trong DB có còn giống lúc đọc hay không (UPDATE users SET balance = 50, version = version + 1 WHERE id = 1 AND version = 2). Nếu version đã thay đổi do luồng khác ghi trước đó, giao dịch sẽ bị từ chối và luồng hiện tại phải thử lại (retry).
    • Ưu điểm: Hiệu năng cực cao khi ít xung đột.
    • Nhược điểm: Tốn tài nguyên CPU để retry nếu tần suất xung đột lớn.
02

Deadlock là gì? Cần thỏa mãn 4 điều kiện Coffman nào để xảy ra Deadlock và làm thế nào để phòng tránh?

Senior

Deadlock (Bế tắc) là hiện tượng hai hoặc nhiều tiến trình/luồng bị treo vô hạn vì mỗi bên đều đang giữ một tài nguyên và chờ đợi để có được tài nguyên mà bên kia đang nắm giữ.

  • 4 Điều kiện Coffman (phải xảy ra đồng thời):
    1. Mutual Exclusion (Loại trừ tương hỗ): Tài nguyên không thể chia sẻ, chỉ có một luồng được giữ tại một thời điểm.
    2. Hold and Wait (Giữ và Chờ): Luồng đang giữ tài nguyên đã cấp phát và tiếp tục yêu cầu thêm tài nguyên mới.
    3. No Preemption (Không cướp đoạt): Tài nguyên không thể bị thu hồi cưỡng chế từ luồng đang giữ nó.
    4. Circular Wait (Chờ đợi vòng tròn): Tồn tại một chuỗi vòng tròn các luồng, trong đó luồng này chờ tài nguyên của luồng tiếp theo.
  • Cách phòng tránh: Chỉ cần phá vỡ ít nhất 1 trong 4 điều kiện trên. Phổ biến nhất là phá vỡ điều kiện Circular Wait bằng cách quy định thứ tự khóa cố định (Lock Ordering) cho toàn bộ hệ thống (ví dụ: Luôn khóa tài nguyên A trước rồi mới khóa tài nguyên B, không được làm ngược lại). Hoặc sử dụng cơ chế giới hạn thời gian chờ khóa (Lock Timeout) để giải phóng nếu chờ quá lâu.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học