Tôi có đoạn mã sau:Cách khắc phục sự cố không đồng bộ của MongoDB/Node này?
// Retrieve
var MongoClient = require("mongodb").MongoClient;
var accounts = null;
var characters = null;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/bq", function(err, db) {
if(err) { return console.dir(err); }
db.createCollection('accounts', function(err, collection) {
if(err) { return console.dir(err); }
else { accounts = collection; }
createAccount("bob","bob");
createAccount("bob","bob");
createAccount("bob","bob");
createAccount("bob","bob");
});
});
function createAccount(email, password)
{
accounts.findOne({"email":email}, function(err, item) {
if(err) { console.dir(err); }
else {
if(item === null) {
accounts.insert({"email":email, "password":password}, function(err, result) {
if(err) { console.dir(err); }
else { console.dir("Account " + email + " created."); }
});
}
else {
console.dir("Account already exists.")
}
}
});
}
Khi tôi chạy kịch bản lần đầu tiên, tôi kết thúc với 4 tài khoản cho bob. Khi tôi chạy nó lần thứ hai, tôi nhận được 4 thông báo rằng tài khoản đã tồn tại.
Tôi khá chắc chắn rằng tôi biết tại sao điều này xảy ra và giải pháp mà tôi đưa ra là sử dụng hàng đợi loại nào đó để xử lý từng đọc/ghi cơ sở dữ liệu theo thứ tự một lần. Những gì tôi muốn biết, liệu đó có phải là cách thích hợp để đi về nó hay không, và thực hành chung tốt nhất cho việc này là gì?
Vì vậy, bạn muốn chèn lần 2, 3 và 4 không thành công? –
Có, vì tài khoản đã tồn tại (nhưng chưa đến). – user2037584
Cách thực hành tốt nhất là thêm một chỉ mục duy nhất trên 'email' và sau đó xử lý lỗi' chèn' nếu có lỗi song song như một hương vị khác của lỗi '" Tài khoản đã tồn tại. "'. – JohnnyHK