這一部分對於別人來說可能很簡單,對我來說簡直摸索的不要不要,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)