Avatar
0
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
Làm chức năng chuyển tiền
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
<span>public</span> <span>void</span> transferMoney(<span>Long</span> start, <span>Long</span> destination, <span>Double</span> cost) {
    <span>if</span> (start.getCost < cost ) -> <span>throw</span> exception(Bạn k đủ tiền)
    <span>try</span> {
        trừ tiền của start
        gọi API phía destination
        cộng tiền cho destination

    } <span>catch</span> {
        <span>throw</span> lỗi
        roll back DB của start
        gọi API trừ tiền của end

    }
}
  • Answer
transaction solution
Remain: 5
1 Answer
Avatar
monkey Professional
monkey Professional
  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:

transaction.begin: thực tế là execute query: set auto commit = false
cộng trừ tiền
transaction.commit: commit kết quả vào db

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 ạ

  • 0
  • Reply