Concurrent update trong mongodb và nodejs



  • Mình muốn hỏi về vấn đề concurrent update trên mongodb và nodejs. Vì nodejs xử lý theo cơ chế bất đồng bộ, nên sau khi hàm gọi callback nodejs xử lý hàm tiếp theo và đợi kết quả của callback trả về thì thực hiện tiếp. Nhưng mình gặp thắc mắc là:

    Có 1 hàm là trừ tiền (x). Đầu tiên mình kiểm tra tiền của người dùng trong db có >= x hay không. Nếu lớn hơn ta trừ tiền và gọi hàm save() - callback.

    Nhưng nếu có số tiền của người dùng là x. Sau đó có 2 request đồng thời gửi lên, sau lần đầu tiền số tiền >=x trừ tiền và lưu lại. Và khi chưa lưu xong thì request thứ 2 check số tiền >=x hay không thì kết quả sẽ là thế nào. Mình cảm ơn



  • Mình nghĩ có 2 hướng này khá đơn giản:

    1. Block DB thì mongoDB có support một thông số là isolated : https://docs.mongodb.com/manual/reference/operator/update/isolated/#up._S_isolated
      Ex:
    db.foo.update(
        { status : "A" , $isolated : 1 },
        { $inc : { count : 1 } }
    )
    

    Isolated sẽ block cho đến khi hoàn thành qua trình write. Không dùng cho shared clusters nên viecj tổ chức thằng collection liên quan cái này thì để riêng ở một service khác.

    1. Dùng một Quêue để thực hiện các thanh toán. Nếu có lỗi thì dùng socket send về id mà transaction bị lỗi:
      https://github.com/OptimalBits/bull

    Cách 2 là suy nghĩ trên logic của mình thoai. Thấy cách 1 có trong tài liệu của MongoDB nên bạn thửu xem.

    Nguyen (Rodgers) Hien.
    Sent from Wood-PC.

    1


  • Cảm ơn bạn nhé. Mình cũng vừa đọc được cái này.



  • Khi mình lấy record đi so sánh thì block db, ví dụ chuyển status là updating, khi nào lưu lại db xong thì chuyển sang idle, luồng check data chỉ lấy thằng nào idle. Vậy là giải quyết đc vấn đề



  • @Henry-Pham said in Concurrent update trong mongodb và nodejs:

    ví dụ chuyển status là updating, khi nào lưu lại db xong thì chuyển sang idle

    Nghĩa là bạn vừa thực hiện 1 phép write xuống db hay sao ?. Cái này không hiểu lắm. Về logic có thể hiểu.

    Nguyen (Rodgers) Hien.
    Sent from Wood-PC.

    0


  • @Henry-Pham Về logic thì mình hiểu. Nhưng làm thế bạn phải write lại trạng thái mà trong lúc đó một request gửi đến đồng thời thì nó vẫn pass qua trạng thái đó. Mình đọc qua thấy hàm findAndModify trong lúc tìm kiếm và update nó sẽ khóa db cho đến khi xong.



  • @Dino Bạn này hiểu đúng nè. Đang tránh việc ghi write lúc này (update cũng là write). Thì block object đó thôi. Cơ mà cái option của thằng kia thì không sài cluster mongoDB được. Lúc này tổ chức nó thanh service riêng cho dễ quản lý là chính.

    Nguyen (Rodgers) Hien.
    Sent from Wood-PC.

    0

Log in to reply