同时保存同一文档只会保存一次。
我在我的应用中有这个流程:
doc.money = 0
现在我的doc.money
等于10而不是15。
如何解决这个问题?甚至不会抛出错误..
var logic = function(doc, options){
doc.a = options.x;
// Some very complex logic here...
}
// incoming ajax request
// query database and get a doc
logic(doc, options)
doc.save(...)
// I have my doc
logic(doc, options);
// Now I have my logic applied
// incoming ajax request
// query database and get a doc
// Some very complex logic here...
var update = {/*insert here the complex part*/}
Doc.update(cond, update, ...)
// I have my doc
// Some very complex logic here...
// Now I have my logic applied
正如您所看到的,在经典方式中,您只有两次逻辑,而且只有一次,更改反映了客户端和服务器端逻辑。
答案 0 :(得分:3)
这实际上与2阶段提交无关,而是与版本控制无关。
您应用程序中的两个单独的线程正在向下发送同一文档的两个不同版本。
在任何数据库中修复此问题的最佳方法是使用版本控制:http://askasya.com/post/trackversions
答案 1 :(得分:1)
它被称为Race Condition。与典型的SQL数据库相比,在MongoDB中解决它很棘手。他们在cookbook上有一个解决方案(或者说是一个黑客)。
基本上,在文档中你有一个state
键。对于每笔交易,您都要保留它的标签。例如,如果state
为ready
,则可以对其执行操作。但首先你要将状态更改为pending
。完成后,再次将其重新设置为ready
。因此无论哪个进程首先进入它,都要更改状态,保存它,然后下一个进程就可以进行处理。您可以扩展这个想法,使其更加安全无虞。看看食谱链接。