日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongodb 事务_MongoDB4 事务 简单易懂的??

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb 事务_MongoDB4 事务 简单易懂的?? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

mongodb 的事務是依靠 mongodb 連接的客戶端 session 實現,事務執行的流程大致是 建立 session,通過 session startTransaction 啟動事務,如果一系列事務都完成,那么 commitTransaction 完成事務操作,并結束當前事務 session;如果一系列事務中有任意事件失敗, 那么 abortTransaction 中止事務,內部將已完成的任務回退到修改之前,并結束當前事務 session。

session

場景描述

當前有兩個用戶,A 用戶有余額 50 軟妹幣,B 用戶有余額 10 軟妹幣,A 用戶給 B 轉賬 10 ,場景設定 轉賬很安全,網絡也很暢通,沒有黑客攔截,沒有發生意外,這次轉賬成功了,這時 A 用戶余額剩下40 ,B 用戶余額有20。A 感覺很安全,這時又給 B 轉賬,A 忘記自己余額有多少,給 B 轉了 50 ,結果出錯了。

在沒有事務的情況下,操作數據庫是這樣的,1.A 賬戶的余額 -50,2. B 賬戶增加50. 當 A 余額不足時或在操作 A 賬戶成功后網絡發生錯誤,B 賬戶的金額沒能正確修改。

在有事務的情況下,即使在操作 A 賬戶金額后出現錯誤,則事務會將整個轉賬過程回退到修改之前。

下載 mongodb4 并解壓

https://www.mongodb.com/download-center#community

wget https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.0.tgztar -xzvf mongodb-osx-ssl-x86_64-4.0.0.tgzcd mongodb-osx-ssl-x86_64-4.0.0!!! Transaction 只適用復制集 Replica Set, 所以要先搭建mongodb 復制集

啟動多個 mongodb 實例

// 創建data目錄 mkdir -p data/1301 mkdir -p data/1302 mkdir -p data/1303// 起三個 mongodb 實例 ./bin/mongod --replSet shard1 --dbpath=./data/1301 --port=1301 ./bin/mongod --replSet shard1 --dbpath=./data/1302 --port=1302 ./bin/mongod --replSet shard1 --dbpath=./data/1303 --port=1303

// 配置復制集 ./bin/mongo --port 1301 rsconf = {_id: "shard1", members: [ { _id: 0, host: "127.0.0.1:1301" } ] } rs.initiate( rsconf ) rs.add("127.0.0.1:1302") rs.add("127.0.0.1:1303")

//查看是否是主節點 rs.isMaster()// 查看復制集狀態 rs.status()

編碼

mkdir mongodb4 cd mongodb4 npm init npm i mongodb -S vi app.js //app.js(async function() {// 連接DBconst { MongoClient } = require('mongodb');const uri = 'mongodb://localhost:1301/dbfour';const client = await MongoClient.connect(uri, { useNewUrlParser: true });const db = client.db();await db.dropDatabase();console.log('(1) 首先 刪庫 dbfour, then 跑路n')// 插入兩個賬戶并充值一些金額await db.collection('Account').insertMany([{ name: 'A', balance: 50 },{ name: 'B', balance: 10 }]);console.log('(2) 執行 insertMany, A 充值 50, B 充值 10n')await transfer('A', 'B', 10); // 成功console.log('(3) 然后 A 給 B 轉賬 10n')try {// 余額不足 轉賬失敗console.log('(4) A 再次轉賬給 B 50n')await transfer('A', 'B', 50);} catch (error) {//error.message; // "Insufficient funds: 40"console.log(error.message)console.log('n(5) A 余額不夠啊,所以這次轉賬操作不成功')}// 轉賬邏輯async function transfer(from, to, amount) {const session = client.startSession();session.startTransaction();try {const opts = { session, returnOriginal: false };const A = await db.collection('Account').findOneAndUpdate({ name: from }, { $inc: { balance: -amount } }, opts).then(res => res.value);if (A.balance < 0) {// 如果 A 的余額不足,轉賬失敗 中止事務// `session.abortTransaction()` 會撤銷上面的 `findOneAndUpdate()` 操作throw new Error('Insufficient funds: ' + (A.balance + amount));}const B = await db.collection('Account').findOneAndUpdate({ name: to }, { $inc: { balance: amount } }, opts).then(res => res.value);await session.commitTransaction();session.endSession();return { from: A, to: B };} catch (error) {// 如果錯誤發生,中止全部事務并回退到修改之前await session.abortTransaction();session.endSession();throw error; //使其調用者 catch error}}})()

查看結果

node app.js

總結

以上是生活随笔為你收集整理的mongodb 事务_MongoDB4 事务 简单易懂的??的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。