Race condition là một vấn đề không mới, mình cũng đã biết từ lâu nhưng toàn trên linux. Để hiểu race condition trên web ta xem 1 ví dụ như sau :
Người A có 10000 $ trong tài khoản, anh ta thực hiện rút 5 lần cùng lúc từ internet banking (bỏ qua 1 số token bảo vệ nhé), mỗi lần 10$, nhưng trong tài khoản chỉ trừ 10$ thôi (lẽ ra phải trừ 50). Vậy lỗi xảy ra ở đâu ?
Xem xét đoạn code sau của ngân hàng trong việc trừ tiền :
Khi tiến trình 1 đang thực hiện câu lệnh $tongtien = $tongtien – $sotien thì một tiến trình 2 của người A đang đòi rút chèn ngang, lúc này hệ thống sẽ tạm dừng tiến trình 1 đang xử lý để quay sang xử lý tiến trình 2 :
Lúc này khi bắt đầu xử lý tiến trình 2, tổng tiền chưa được cập nhật bởi tiến trình 1 đã tạm dừng. Do đó số tiền trong tk lúc này vẫn là 10000 và sau khi thực hiện xong cả 2 tiến trình thì tổng tiền vẫn là 9990 mặc dù đã rút 2 lần. Như vậy race condition đã xảy ra khi mà 1 tiến trình chèn ngang tiến trình khác trong lúc các tham số vẫn chưa kịp cập nhật.
Ở đây mình tạo 1 đoạn code lấy tiền với khá nhiều việc, làm cho thời gian xử lý nó lên tới tận 1,2s và cố thử rút 8 lần mà chỉ bị trừ 10$
B1, kiểm tra tài khoản ban đầu và xem access log , lúc này ta đang có 10000:
B2, Xử dụng 1 đoạn python để cùng 1 lúc gửi 8 request, mỗi request đều rút 10$ trong cùng 1 thời gian và xem kết quả trả về :
Như vậy sau 10 request, tổng tiền chỉ bị trừ 10$ trong khi đã rút đến 8 lần.
B3. Kiểm tra log file ta thấy 8 request này tới cùng lúc. Và bởi vì server phải đòi hỏi đến 1 giây để xử lý 1 giao dịch, do đó 8 request này đã làm xuất hiện race condition và bị chèn ngang lẫn nhau.
Nguồn Blog
http://antoanthongtin.wordpress.com
Người A có 10000 $ trong tài khoản, anh ta thực hiện rút 5 lần cùng lúc từ internet banking (bỏ qua 1 số token bảo vệ nhé), mỗi lần 10$, nhưng trong tài khoản chỉ trừ 10$ thôi (lẽ ra phải trừ 50). Vậy lỗi xảy ra ở đâu ?
Xem xét đoạn code sau của ngân hàng trong việc trừ tiền :
Khi tiến trình 1 đang thực hiện câu lệnh $tongtien = $tongtien – $sotien thì một tiến trình 2 của người A đang đòi rút chèn ngang, lúc này hệ thống sẽ tạm dừng tiến trình 1 đang xử lý để quay sang xử lý tiến trình 2 :
Lúc này khi bắt đầu xử lý tiến trình 2, tổng tiền chưa được cập nhật bởi tiến trình 1 đã tạm dừng. Do đó số tiền trong tk lúc này vẫn là 10000 và sau khi thực hiện xong cả 2 tiến trình thì tổng tiền vẫn là 9990 mặc dù đã rút 2 lần. Như vậy race condition đã xảy ra khi mà 1 tiến trình chèn ngang tiến trình khác trong lúc các tham số vẫn chưa kịp cập nhật.
Ở đây mình tạo 1 đoạn code lấy tiền với khá nhiều việc, làm cho thời gian xử lý nó lên tới tận 1,2s và cố thử rút 8 lần mà chỉ bị trừ 10$
B1, kiểm tra tài khoản ban đầu và xem access log , lúc này ta đang có 10000:
B2, Xử dụng 1 đoạn python để cùng 1 lúc gửi 8 request, mỗi request đều rút 10$ trong cùng 1 thời gian và xem kết quả trả về :
Như vậy sau 10 request, tổng tiền chỉ bị trừ 10$ trong khi đã rút đến 8 lần.
B3. Kiểm tra log file ta thấy 8 request này tới cùng lúc. Và bởi vì server phải đòi hỏi đến 1 giây để xử lý 1 giao dịch, do đó 8 request này đã làm xuất hiện race condition và bị chèn ngang lẫn nhau.
Nguồn Blog
http://antoanthongtin.wordpress.com
0 comments:
Post a Comment