Trường hợp thực tế nào gây ra bug phantom read và non-repeatable read?
Mình thấy 2 cái này đúng logic như mà tại sao lại cho là bug. Cho mình hỏi trường hợp thực tế nào gây ra bug cho dễ dung không ạ ?
Non-repeatable read: A gọi cùng 1 câu query 2 lần (select chẳng hạn), B execute query update dữ liệu, trùng hợp là nó xảy ra giữa 2 lần A query, nên kết quả lần 2 trả về cho A khác lần 1 dù cùng 1 câu query dẫn đến kết quả mà A tính toán dựa vào lần query thứ 2 nó không khớp với lần 1, thường giải quyết bằng cách lưu lại giá trị query rồi mới sử dụng.
Phantom read: như trên nhưng thay vì B update thì B thêm hoặc xóa 1 record, dẫn tới giá trị của row trả về thì không đổi nhưng select sum(money) from table
sẽ cho kết quả khác nhau vì số lượng row thay đổi
Các lỗi mà bạn đang nhắc đến đều có 1 đặc điểm chung là có sự tranh chấp giữa các bên (party) khác nhau. Trong các ngôn ngữ lập trình thì đó là race condition.
Một ví dụ đơn giản cho các tranh chấp và hậu quả trong thực tế là khi có sự tranh chấp là việc tăng biến đếm lên 1 đơn vị mỗi lần thực thi.
Để tăng biến đếm sẽ có 3 bước cần thực hiện:
B1: Lấy giá trị cũ
B2: Tăng giá trị cũ lên 1 đơn vị
B3: Ghi giá trị mới
VD có 2 party là A và B thực hiện 3 bước trên rất có khả năng cả A và B đều đồng thời thực hiện, A lấy giá trị cũ (VD = 0) cùng lúc B cũng lấy giá trị cũ ( = 0), A và B cùng tăng lên 1, cả A và B đều ghi 1 vào record như là giá trị mới, kết quả là biến đếm chỉ tăng lên 1 trong khi đúng phải là 2