a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > MongoDB > 正文

mongoDB 4.0事務回滾的辛酸歷程探究

2020-10-29 18:43:44
字體:
來源:轉載
供稿:網友

前言

主管前幾天發現mongoDB已經升級到4.0了,迫不及待得讓我實現他期待已久的事務回滾,發現還是有很多坑啊!

下面是我將已有的本地mongoDB升級到支持事務回滾的歷程,分享出來,有錯誤的地方歡迎指正!

以mac為例哈

部署mongodb事務回滾

1.準備工作

升級mongodb至4.0.0

$ brew upgrade mongodb

升級或安裝mongodb.js v3.1.0 以上

$ npm i mongodb --save-dev


升級完上述后,db.js里連接mongo時,

會警告,讓你在connect的option里加一個字段

useNewUrlParser:true

這時如果有用戶驗證,還需要在connect的option里再加一個字段

authSource:用戶所在的db,一般為admin

否則會報驗證失敗,找不到用戶的錯誤,比如

 const mongoClient = await MongoClient.connect(mongoClientUrl, {  auth: {  user: config.dbUserName,  password: config.dbUserPassword,  },  authSource:'admin',  useNewUrlParser:true, });

2.將已有的數據庫改造成復制集

目前事務回滾只能在復制集上操作,單獨的mongodb server是不能操作事務的

關掉所有的mongod

在平時啟動mongod的命令后添加--replSet rs0,比如

$ mongod -dbpath ./db --port 27017 --replSet rs0

再開個shell,創一個不同端口的mongo實例,比如

$ mongod -dbpath ./db_repl --port 27018 --replSet rs0

連接27017的mongo實例,并設置

$ mongo$ rs.initiate()$ rs.add('localhost:27018');

完成

3.寫回滾代碼

在db.js里新增了一個方法

 export const getSession = async function() {  return await state.mongoClient.startSession(); };

每次在需要回滾的mongo代碼前調用這個方法拿到session,開始回滾的標記

 const session = await db.getSession(); session.startTransaction({  readConcern: {level: 'snapshot'},  writeConcern: {w: 'majority'}, });

在每次調用mongodb.js的方法操作數據庫時,都要帶上session,比如

 db .collection(this.collecitonName) .insertOne(doc,{session});

在你處理錯誤并覺得需要回滾了,執行

await session.abortTransaction();

在你覺得沒問題,一起正常結束時,執行

await session.commitTransaction();

我的代碼里可能有一些封裝的代碼沒有放上去,導致不一定能理解。我只是舉個栗子去實現,具體的代碼實現可以看參考鏈接1

4.總結

useNewUrlParser這個屬性會在url里識別驗證用戶所需的db,未升級前是不需要指定的,升級到一定要指定,不管是在url后面,還是用authSource

事務回滾只能在復制集上操作,我猜測實現的原理可能是這樣:先記錄主節點的session,然后回滾的話,通過這個session查找副節點的數據快照,然后將這快照再應用到主節點上,實現回滾。當然,實際情況應該相當復雜,不然mongoDB也不會用3年時間來實現這個操作。

5.參考鏈接

  • mongoDB官方關于事務的介紹
  • mongoDB中文社區關于replSet的介紹
  • 如果不想進行第二步,run-rs可以直接為你創建一個新的mongoDB復制集

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欲色av| 久久人人网 | 欧美一区二区二区 | 日韩欧美国产网站 | 大香萑 | 久久久精品日本 | 欧美日韩久久精品 | 成人精品视频在线 | 欧美精品第一页 | 色婷婷亚洲一区二区三区 | 欧美一区二区三区爽大粗免费 | 午夜国产羞羞视频免费网站 | 久久99精品视频 | 一区二区在线观看视频 | 久久久久久久久久久久影院 | 欧洲成人在线视频 | 天堂久久久久久久 | 一级毛片在线播放 | 国产成人精品一区二区在线 | 国产精品一区二区久久乐夜夜嗨 | 黄色网址视频 | 91婷婷射 | 亚洲一区成人 | 亚洲天堂一区二区三区 | 色九九 | 日韩国产高清在线 | 特黄aaaaaa裸体视频 | 日本三级做a全过程在线观看 | 国产精品自产拍在线观看桃花 | 日韩av一区二区在线 | 免费看片国产 | 天天操天天干天天干 | 欧美aⅴ一区二区 | av一道本| 日本久久精品 | а天堂中文最新一区二区三区 | 欧美日韩成人在线视频 | 久久综合九九 | 91精品一二区 | 在线色网 | 人人九九|