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 事务 简单易懂的??的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb 事务_MongoDB 事
- 下一篇: xml发生错误_WEB之web.xml详