使用 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.JdbcOdbc...