gpt4 book ai didi

node.js - 使用 Node.js 的 CouchDB 客户端支架时如何处理文档更新冲突?

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:25 26 4
gpt4 key购买 nike

1000000 个客户端尝试使用 flatiron/cradle 更新 couchdb 文档同时。如何处理所有更新冲突?

最佳答案

这里是解决方案:

var cradle = require('cradle');
var c = new(cradle.Connection)({cache: true} ) ;

var db = c.database('ml');

function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) {
return;
}

if (index < iterations) {
index++;
func(loop);

} else {
done = true;
callback();
}
},

iteration: function() {
return index - 1;
},

break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}

//----------------------------------------

function revloop(game,gamenumber, callback){

db.get('testdocument', function (err, doc) {


if (err) {
// Handle error
} else {
// Handle success

db.save('testdocument', doc._rev ,{
game:game,
gamenumber:gamenumber

}, function (err, res) {
if (err) {
console.log(err);
if(err.reason=='Document update conflict.')
{callback(0);}
else{console.log('other errror');callback(1)}
} else {
console.log('new game created');

callback(1);
// Handle success


}// success save opengames end bracket
});
}

});
}

//-----------------------------------
asyncLoop(100 ,function(loop){

revloop('b-against-c',3,function(callback){
if(callback == 0){
loop.next();
}
else{loop.break();}
});

} , function(){ console.log('loop finished')});

这个解决方案使用了很棒的 asynchronous Loop来自 Ivo Wetzel。

这里是测试,由于向 _rev 添加字符串导致了九次更新冲突:

var cradle = require('cradle');
var c = new(cradle.Connection)({cache: true} ) ;

var db = c.database('ml');

function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) {
return;
}

if (index < iterations) {
index++;
func(loop);

} else {
done = true;
callback();
}
},

iteration: function() {
return index - 1;
},

break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}

//----------------------------------------
var revchanger= 0;
function revloop(game,gamenumber, callback){
revchanger ++;
var addstuff = revchanger== 10? '':'123';// this will cause nine update conflicts

db.get('testdocument', function (err, doc) {


if (err) {
// Handle error
} else {
// Handle success

db.save('testdocument', doc._rev+addstuff ,{
game:game,
gamenumber:gamenumber

}, function (err, res) {
if (err) {
console.log(err);
if(err.reason=='Document update conflict.')
{callback(0);}
else{console.log('other errror');callback(1)}
} else {
console.log('new game created');

callback(1);
// Handle success


}// success save opengames end bracket
});
}

});
}

//-----------------------------------
asyncLoop(100 ,function(loop){

revloop('a-against-b',2,function(callback){
if(callback == 0){
loop.next();
}
else{loop.break();}
});

} , function(){ console.log('loop finished')});

创建数据库“ml”:创建ml.js:

var cradle = require('cradle');
var c = new(cradle.Connection) ;

var db = c.database('ml');
db.create();

创建一个测试文档:创建测试文档.js:

var cradle = require('cradle');
var db= new(cradle.Connection)().database('ml');

db.save('testdocument' , {
game: 'gamename1',
gamenumber:1

}, function (err, res) {
if (err) {
// Handle error
} else {
// Handle success
}
});

在浏览器中查看:

http://localhost:5984/ml/testdocument

关于node.js - 使用 Node.js 的 CouchDB 客户端支架时如何处理文档更新冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22325412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com