MongoDB4 事務 簡單易懂的

2021-09-11 21:16:46 字數 2834 閱讀 7239

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

session = client.startsession(); 

session.starttransaction();

session.committransaction();

session.aborttransaction();

session.endsession();

複製**

當前有兩個使用者,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 賬戶金額後出現錯誤,則事務會將整個轉賬過程回退到修改之前。

複製**

!!! transaction 只適用複製集 replica set, 所以要先搭建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 = ] }

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

複製**

(async

function() = require('mongodb');

const uri = 'mongodb://localhost:1301/dbfour';

const client = await mongoclient.connect(uri, );

const db = client.db();

await db.dropdatabase();

console.log('(1) 首先 刪庫 dbfour, then 跑路\n')

// 插入兩個賬戶並充值一些金額

await db.collection('account').insertmany([

,]);

console.log('(2) 執行 insertmany, a 充值 50, b 充值 10\n')

await transfer('a', 'b', 10); // 成功

console.log('(3) 然後 a 給 b 轉賬 10\n')

try catch (error)

// 轉賬邏輯

async

function

transfer(from, to, amount) ;

const a = await db.collection('account').

findoneandupdate(, }, opts).

then(res => res.value);

if (a.balance < 0)

const b = await db.collection('account').

findoneandupdate(, }, opts).

then(res => res.value);

await session.committransaction();

session.endsession();

return ;

} catch (error)

}})()

複製**

複製**

MongoDB4 安裝,配置遠端

wget 或者 找自己想要安裝的版本指定目錄並mv名稱 sudo tar zxvf mongodb linux x86 64 rhel70 4.4.1.tgz c usr local sudo mv mongodb linux x86 64 rhel70 4.4.1 mongodb建立db目錄和日誌...

windows下安裝配置mongodb4 x版本

現在mongod出到4.x的版本,而網上的大多數教程是針對3.x的版本的。很多在3.x的配置操作在4.x看來是很沒有必要的,特此說明一下。首先在官網 我不喜歡把軟體裝在系統盤,所以我選擇 custom,自己選要裝在 然後就跳出來下面這張圖。針對下面這張圖我翻譯一下官方文件上的內容作為解釋。從 mon...

CentOS安裝MongoDB4,並設定遠端連線

首先,說一點自己安裝軟體的感想 第二,盡量在官網找到對應安裝包版本的安裝手冊 第三,如果安裝包不是二進位制可執行檔案或rpm包,而是壓縮包,解壓後,仔細看一下readme中的內容 這裡將個人在centos安裝mongodb4的過程,做個記錄,有需要的朋友可以參考一下 第一,這裡選擇yum安裝,配置m...