Em có 1 ví dụ với ứng dụng banking trong Spring Boot như sau :
Account A hiện đang có 1000$ ( lưu ở DB )
Có 2 request yêu cầu nạp tiền cùng 1 thời điểm tại account A với số tiền lần lượt là 200$ và 400$
=> Nếu đúng thì accout A sẽ có 1600$
Tuy nhiên trong lúc yêu cầu đầu tiên chưa update DB lại tổng tiền mới (1000$ +200$ = 1200$) thì yêu cầu thứ 2 đang chạy song song lấy tổng tiền cũ từ DB nên cũng update dựa trên tổng tiền cũ ( 1000$ + 400$ = 1400$ )
=> Tổng tiền mới sau 2 luồng chạy xong là 1400$ thay vì 1600$. 200$ của luồng 1 do update trước nên bị mất.
Em nghĩ trong Spring Boot nếu chúng ta không lock 1 account khi account đó trong quá trình xử lí thì sẽ gây ra hậu quả như trên.
Em nghĩ trường hợp như trên trong thực tế cũng có thể xảy ra ạ.Giải pháp xử lí tình trạng trên trong thực tế với Spring Boot là như thế nào ạ ?
Em có suy nghĩ đến synchronize nhưng nếu dùng synchronize thì có vẻ ko đúng cho lắm vì có thể nó sẽ lock luôn các luồng của account khác.Em muốn chỉ lock đúng accout mà đang xử lí thôi còn account khác thì cho chạy bình thường.