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)

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