与mongoose的交易行为

假设我有一个mongoose模式A 它看起来像这样:

 { arr: [{ num: Number, text: String }] } 

现在我要执行以下操作:

  1. select一个即a

  2. 获取a.arr项目的实际数量。

  3. a.arr添加一个新的元素,数量和文本。

我的实现:

 A.findOne({_id: someId}, function(err, a) { var count = a.arr.length; a.push({ count: count, text: 'some text' }); a.save(...) }); 

到目前为止工作良好。 但我的问题:如果我执行并发,让我们说5个进程,一些进程执行findOne之前保存其他人。 因此,前几个计数为0,然后在保存时立即为3或4进行下一个进程。

但是我想要执行串行。

如何实现?

谢谢!

在mongo中没有事务支持,但是你可以按照http://cookbook.mongodb.org/patterns/perform-two-phase-commits/

或者,您可以在进程之间实现一些协调,如果数据支持此scheme,则可以将数据范围分配给特定进程。

编辑:以非常简单的forms,您可以通过添加属性lockProcessId并使用以下命令序列来实现一些乐观的文档locking:

 db.A.findAndModify({_id: someId, lockProcessId:{$exists:false}},{$set:{lockProcessId: someProcessId},{new:true}} db.A.findAndModify({_id: someId, lockProcessId:someProcessId},{$push:{arr:{ count: count,text:'some text'}},$unset:{lockProcessId:1}}) 

如果第一个查询不返回任何内容,则应该跳过这个文档,否则应该运行第二个查询

但是,如果某些进程在中途死亡,则可能会locking一些文档,可能需要一些调度程序来清除locking的状态。