RACE CONDITION là gì? Cách xử lý khi rơi vào RACE CONDITION

RACE CONDITION LÀ GÌ? CÁCH XỬ LÝ KHI RƠI VÀO RACE CONDITION

race-condition-la-gi

1. Khái quát về race condition

  • Race Condition là trường hợp khi nhiều threads cùng truy cập vào và cùng lúc muốn thay đổi dữ liệu.
  • Ví dụ cụ thể:

RACE CONDITION LÀ GÌ

Code mẫu: Hàm nói về việc rút tiền từ tài khoản
Chú thích
: getBalance: lấy số tiền hiện đang có trong tài khoản
setBalance: cập nhật số tiền còn lại sau khi rút ra

Sau một thời gian hoạt động thì tài khoản của khách hàng này là số âm. Vậy lý do là gì? Race Condition là một lời giải đáp

Với đoạn code ở trên, tình huống đặt ra là nếu có hai yêu cầu đến gần như cùng một lúc, thì chúng sẽ được thực thi cùng một lúc hoặc việc thực thi chúng sẽ bị xen kẽ. Kết quả là một vài các yêu cầu cuối cùng được xử lý như thế này:

RACE CONDITION LÀ GÌ

Sau khi hai yêu cầu được xử lý, số dư là là 100$ – 10$ – 15$ =75$. Nhưng vì yêu cầu thứ 1 vẫn đang thực hiện, chưa hoàn tất việc cập nhật ví tiền thì yêu cầu thứ hai chen vào. Điều này là nguyên nhân dẫn đến dữ liệu bị sai. Và như ví dụ trên thì ví tiền chỉ bị trừ 10$

Đó là ví dụ minh họa rõ nhất về Race Condition.

2. Cách xử lý khi rơi vào Race Condition

Có nhiều cách để xử lý, nhưng ở đây mình sẽ sử dụng LOCK để giải quyết bài toán ở trên nha.

Giải pháp của mình là: Khi có thread truy cập vào để lấy dữ liệu, mình sẽ LOCK file lại, khi thread hoàn tất việc setBalance thì mình sẽ UNLOCK file. Mình sử dụng 1 file trung gian để kiểm tra việc Lock/Unlock

  • Kiểm tra xem nếu file là UNLOCK thì mới cho phép đọc dữ liệu
  • Thực hiện LOCK file và thực hiện các yêu cầu bên dưới
  • Sau khi hoàn tất, UNLOCK file

LOCK có nhiều cách Lock, tùy vào yêu cầu mà lựa chọn loại Lock phù hợp. Mình sẽ chi tiết về Lock sau. Code tham khảo sẽ update sớm nhất có thể.
Cảm ơn các bạn đã quan tâm. Mong nhận được đóng góp của các bạn. Thank You !!!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *