mongo4.0事务使用记录(二):nodejs中的事务使用

这一部分对于别人来说可能很简单,对我来说简直摸索的不要不要,o(╥﹏╥)o
后端服务器使用的是nodejs+express进行搭建,前端通过调用后端接口进行数据的增删改查,使用pm2进行部署。
本来打算每一次请求开启一个mongo连接,开启一个session,但是!!!!!!! 会报错,具体的错误提示我没保留下来,翻译过来的大致意思是,你需要在程序启动时就进行session的开启。
因此只能在入口app.js文件进行总体部署,如下图(PS:太low勿喷):
在这里插入图片描述
我采用mongoose进行mongo连接,个人感觉在事务方面比使用mongo连接更友好一点。
在文件中最好能将异步方法进行同步化,否则会出现:当你要在删除数据后在进行重新录入,结果返回录入成功,但是数据库中该条数据被删掉了的情况。

由于项目原因,具体的代码不方便展示出来,因此我会详细说明下。由于在app.js中将session进行了全局化。在此处我直接使用下面的方法进行代码编写。我感觉使用withTransaction有个好处,不用你自己去进行开启(session.startTransaction())、提交(session.commitTransaction())、回滚(session.abortTransaction())等操作。虽然原理还没摸得很明白,但是好用啊!!!O(∩_∩)O哈哈~
不过还是建议大家去官网认真研究下,毕竟我的英文实在太差咯~
MongoDB transaction
Mongoose 5.7.12

await session.withTransaction(async () => {逻辑代码}

以下的一些问题需要格外注意下:

  • 尽量不要使用多线程进行数据录入,nodejs是单线程,虽然使用pm2进行的多线程部署,但是主线程还是只有一个。多线程数据发送录入时,会提示Transaction already in progress,数据会丢失。
  • 类似于Model.findByIdAndRemove()这种有callback的参数,在你添加session时程序启动不会报错,但是运行时就会报错。因此建议Model.findOneAndUpdate({ 'name': '测试' }, result, { upsert: true }, null, { session })这种写法,就是将callback的地方写为null,亲测可行!!
  • 如果你的Model中有数据库增删改查的以下方法,也请不要忘记在参数最后加上{session},不然会提示你Model的验证不通过,会让你感觉不是数据库的问题,而是数据的问题。其实根本原因还是你没加session。
  • Model.create([list], { session }),该方法中的数据传入请使用列表形式,不然不会给你报错,会出现warning,但是程序会运行不下去。
  • Model.save()会提示该方法不存在,我没太搞明白是为什么????求解惑

事务就先告一段落好了,其中碰到了很多error,但也没一一记录下来,有点遗憾。希望有什么问题可以留言,如果我碰到过,一定会努力帮您解决一下下…(OS:虽然不知道能不能解决,o(╯□╰)o)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章