如何防止Mongodb / NodeJS中的竞争状况

时间:2019-10-15 05:08:42

标签: node.js mongodb

我什至不确定它是否具有特定名称,但这是方案:

  • 用户1和用户2都访问数据库中的一条记录(因此它们实际上具有相同的记录)
  • 用户1更新记录
  • 用户2尝试更新记录,但是由于数据已更改,因此应该失败。

当我使用C#和SQL Server进行编程时,如果表中包含时间戳,则Entity Framework(用于.Net的数据库框架)将自动处理此问题,并且无法更新已修改的数据。

MongoDB / NodeJS中有类似的东西吗?

谢谢 马丁

3 个答案:

答案 0 :(得分:0)

mongodb中没有内置的时间戳功能,但在这种情况下,mongoose可能会有所帮助:

https://mongoosejs.com/docs/guide.html#timestamps

答案 1 :(得分:0)

在MongoDB中,并发交易模型并不明显,但可以访问- https://docs.mongodb.com/manual/core/transactions/

答案 2 :(得分:0)

我个人建议远离猫鼬。

您可以做的是创建一个locked属性:

  1. 用户1尝试更新记录,该记录以findOneAndUpdate({locked: null, ...restOfConditions})开头并将locked设置为true。

  2. 用户2尝试更新一条记录,但它未能findOne,因为部分条件是始终查询{locked: null}

  3. 用户1完成了一条记录的更新,这是上次更新的一部分,它取消设置locked

这显然需要您实施,但我希望它能使您想到我会选择的方法。