并发问题

  1. 当多个异步函数同时操作数据库时,就可能发生这样的情况,具体的场景往往发生在并发请求中

  2. 面对这种情况, mongoose 作出以下假设:

    • 当修改一个文档时,如果某些字段已经不再和数据库对应,说明这个字段的数据是脏数据(dirty data),对于脏数据,不应该对数据库产生影响
    • 当修改一个文档时,如果字段和数据库是对应的,则是正常数据,正常数据可以正常的更改数据库

解决并发问题

  1. mongoose 对于上述场景的处理如下:

  2. 可以看出,对于 user2 的修改,nameloginId 是脏数据,因此不会更新到数据库中,而 age 是正常数据,对它的更改会应用到数据库

  3. 然而,mongoose 无法准确的判定对数组是否是脏数据,因此,如果遇到数组的修改,mongoose 会做出如下处理:

    • 当新增文档时,会自动添加字段 __v ,用于记录更新版本号,一开始为 0
    • 通过模型实例对数组进行修改后,保存时会在内部调用实例的 increment 函数,将版本号 +1
    • 当其他模型实例也更改了数组,保存时会对比版本号,如果不一致,则会引发 VersionError
  4. 原理图如下:

  5. 出现错误是好事,可以提醒开发者:这一次保存的某些数据是脏数据,应该引起重视。开发者可以灵活的根据具体情况作出处理,比如提示用户保存失败,或者重新获取数据然后保存;

  6. 由于 mongoose 仅针对数组进行版本控制,如果要针对所有字段都进行版本控制,需要使用 mongoose 的插件:mongoose-update-if-current ,使用插件后,所有的字段都将受到版本控制,一旦版本不一致,将引发 VersionError

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 并发问题
  2. 2. 解决并发问题