【问题标题】:Django Mongoengine concurrent saves are failingDjango Mongoengine 并发保存失败
【发布时间】:2013-04-25 22:20:01
【问题描述】:

我有一个使用 Mongoengine 在 Django 上运行的 Web API,它执行以下操作

print "Saving", data
modelObj.dataList.append(data)
modelObj.save()

我还有一个 API 会在一个非常紧凑的循环中调用此函数,这会导致以下日志:

Saving {'answer': u'3'}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10
Saving {'answer': u'2'}
Saving {Saving {'answer': u'5'}}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 30
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 30
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10
Saving {'answer': u'1'}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10

显然,保存是同时进行的。输出是我很少看到所有 5 个结果都写入数据库。我在这里忽略了一些真正基本的东西吗?

更新:使用 Mongoengine 0.7.9。文档状态:

Changed in version 0.5: In existing documents it only saves changed fields using  
set / unset. Saves are cascaded and any DBRef objects that have changes are saved as well.

不确定这是否反驳了我的理论......

【问题讨论】:

  • 翻遍逻辑,如果我拉出一个modelObj(A),其他并发方法对该modelObj的任何操作都不会反映。大概调用“保存”是绝对操作而不是加法...

标签: python django mongodb mongoengine


【解决方案1】:

mongoengine 中的保存是原子的,但是,当保存列表时,它会将 整个列表 的保存为 $set。所以你可能有一个竞争条件。

这就是为什么附加到列表的首选方法是执行$push 例如:

modelObj.update(push__dataList=data)

【讨论】:

  • 太棒了,谢谢。很高兴得到维护者的评论 :) 出于好奇,如果我的列表实际上被附加到另一个列表中,这会是什么样子?我简化了示例,但看起来像这样modelObj.dataList[index].append(data),其中 index 在我的并发示例中是相同的值。
【解决方案2】:

table_name.objects.filter(__id=1).update(push__fieldname={'key' : 'value','key' : 'value',}) 如果你想删除而不是拉动

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多