Em muốn thiết kế 1 chức năng transfer money đơn giản như này có rủi ro gì k ạ
@Transaction public void transferMoney(Long start, Long destination, Double cost) { if (start.getCost < cost ) -> throw exception(Bạn k đủ tiền) try { trừ tiền của start gọi API phía destination cộng tiền cho destination } catch { throw lỗi roll back DB của start gọi API trừ tiền của end } }
1. Nếu em chỉ có 1 consumer xử lý giao dịch thì ok, không có rủi ro gì
2. Nếu em có 2 consumer xử lý giao dịch thì vẫn có nguy cơ cộng hoặc trừ tiền 2 lần, vì bản chất khi em gọi transaction ở phía client như java chẳng hạn thì nó sẽ là thế này:
Như vậy thì ở trong môi trường đa luồng, nhiều consumer thì việc kiểm tra số dư vẫn có thể chính xác 2 lần dẫn đến cộng trừ tiền 2 lần em ạ