与mongoose的交易行为
假设我有一个mongoose模式A
它看起来像这样:
{ arr: [{ num: Number, text: String }] }
现在我要执行以下操作:
-
select一个即
a
。 -
获取
a.arr
项目的实际数量。 -
向
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的状态。