微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 MongoDB 的预订系统中的双重预订

如何解决使用 MongoDB 的预订系统中的双重预订

我一直在使用 node、express 和 MongoDb (mongoose) 构建预订系统。我的约会模式:

const appointmentSchema = mongoose.Schema({
  date: Date,freeSlots: Number,reservations: [{type: mongoose.Types.ObjectId,ref: 'Reservation'}],event: mongoose.Types.ObjectId,});

我的主要想法是进行原子更新以确保预订时不会发生错误

updateAppointment(date,eventId,newReservation.id).then(
    async (updateResult) => {
      if (updateResult.nModified === 1)  // Continue my logic
     })

这是我的辅助方法

const updateAppointment = (date,newOrder) => {
  return Appointment.updateOne(
    {
      date: {$eq: date},freeSlots: {$gt: 0},event: eventId,},{$inc: {freeSlots: -1},$push: {reservations: newOrder}}
  );
};

在每次预订时,我都会减少 freeSlots 并将预订推送到预订数组。但是,我可以看到在某些约会中,保留的数量超出了允许范围。我相信如果发生这种情况,那么 freeSlots 应该是一个负数。怎么显示为0?下面是一个创建的约会示例,其中只有 5 个空闲时段,但一段时间后它包含 8 个预订!

{"_id":{"$oid":"5fd589c508949f73c0118220"},"reservations":[{"$oid":"5fd7c95357fb0bae178f990e"},{"$oid":"5fd8152682279bb3d43ce201"},{"$oid":"5fd8178782279bb3d43ce203"},{"$oid":"5fdb7ba43a6b35e4e7907d1f"},{"$oid":"5fdba7063a6b35e4e7907d54"},{"$oid":"5fdceff13a6b35e4e7907dea"},{"$oid":"5fdcf6133a6b35e4e7907df2"},{"$oid":"5fdcf6ec3a6b35e4e7907df3"}],"date":{"$date":"2020-12-19T10:00:00.000Z"},"freeSlots":0,"event":{"$oid":"5fce5a80a0f1ee45d9aa04e1"},"__v":0}

我已经使用 Apache Jmeter 测试了端点,其中有 2 个组,每个组有 25 个线程,但它没有给我超过允许的数量!谁能弄清楚为什么它对我有用而对真实用户却不是?

编辑: 在修改了复制的概念之后,写和读的问题。我认为问题是因为 MongoDB Atlas 添加了 3 个副本,而我没有管理这些写操作将如何发生。使用 Quorum Consensus concept 后,我的问题已解决或停止发生!这个解决方案解释了为什么 Apache Jmeter 没有重现相同的错误,因为我是在我的本地机器上测试(没有副本)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?