Fix lỗi bất đồng bộ trong việc insert vs update mongodb



  • Bài toàn đưa ra của mình hiện tại chỉn đơn giản là update các bản ghi vào nếu đã tồn tại, ngược lại thì insert...

    addCustomer: function (customer, service, callback) {
    CustomerModel.getlist(function (err, customers) {
    customer.potentialService = service;
    if(!err) {
    if(customers.length > 0) {
    // Update
    CustomerModel.update(customer);
    }
    else {
    CustomerModel.insert(customer);
    }
    }
    }, {query: {email: customer.email, potentialService: service}});
    }

    Như đoạn code mình gestlist theo điều kiện email, potentialService truyền vào rồi nhưng nếu f5 với tốc độ cao sẽ ra trường hợp chưa nó insert 2 bản ghi tương tự nhau chứ k phải 1. Tức là việc getlist() còn thực thi sau cả đoạn insert bên trong nó. :(

    => Bạn nào biết các fix giúp mình với ạ?



  • Cách trình bày code và post code lên topic hơi xấu, bạn cần format code cho pretty hơn, dọc code của bạn mình không hiểu cho lắm, nhưng mình thấy có lỗi sai cơ bản là hàm addCustomer có parameter là callback nhưng bạn lại không gọi lại hàm callback.

    addCustomer: function(customer, service, callback) {
        CustomerModel.getlist(function(err, customers) {
            customer.potentialService = service;
            if (!err) {
                if (customers.length > 0) {
                    // Update
                    CustomerModel.update(customer, callback);
                } else {
                    CustomerModel.insert(customer, callback);
                }
            }else{
                callback(err);
            }
        }, {
            query: {
                email: customer.email,
                potentialService: service
            }
        });
    }
    

    NHAN NGUYEN

    1


  • @nguyenquynhan:
    Ví dụ như code của mình thì nó request 2 lần liên tiếp gần nhau nó sẽ sảy ra trường hợp là ->CustomerModel.getlist() thực thi quá nhanh cho ->customers.length == 0,
    ->CustomerModel.insert() thì lại chậm hơn lần getlist() thứ 2 vẫn chưa có bản ghi nào nên dẫn tới insert trùng lặp bản ghi.

    Như code bạn sửa thì là tận dụng callback với kịch bản cụ thể thế nào cho ổn nhỉ?



  • Cách check trong code la các kiểm tra tạm thời, mình nghĩ nếu muốn toàn vẹn dữ liệu thì nên set unique trong database.
    Nếu bạn xài mongodb thì có thể tham khảo link này
    https://docs.mongodb.com/manual/core/index-unique/

    NHAN NGUYEN

    0


  • 1: Bạn bung Schema CustomerModel và thêm thuộc tính unique:true vào mô tả field Email, cơ bản là 1 user chỉ 1 email thì sẽ không có chuyện nó insert 2 record có cùng email.

    2: App node của bạn và mongoDB sẽ là 2 process khác nhau. Và nói luôn mongoDB insert khá nhanh, vì vậy nếu app và mongo cùng một server/máy chủ mà bạn F5 reload trang nhanh hơn nó insert thì phải xem lại code vì sao lại bị insert chậm vậy ?
    Còn nếu khác server (App ở một server còn mongoDB ở server khác ) thì có thể do đường truyền giữa 2 server.


Log in to reply