精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

認識MongoDB 4.0的新特性——事務(Transactions)

數據庫 其他數據庫 MongoDB
以前 MongoDB 是不支持事務的,因此開發者在需要用到事務的時候,不得不借用其他工具,在業務代碼層面去彌補數據庫的不足。隨著 4.0 版本的發布,MongoDB 也為我們帶來了原生的事務操作,下面就讓我們一起來認識它,并通過簡單的例子了解如何去使用。

前言

相信使用過主流的關系型數據庫的朋友對“事務(Transactions)”不會太陌生,它可以讓我們把對多張表的多次數據庫操作整合為一次原子操作,這在高并發場景下可以保證多個數據操作之間的互不干擾;并且一旦在這些操作過程任一環節中出現了錯誤,事務會中止并且讓數據回滾,這使得同時在多張表中修改數據的時候保證了數據的一致性。

以前 MongoDB 是不支持事務的,因此開發者在需要用到事務的時候,不得不借用其他工具,在業務代碼層面去彌補數據庫的不足。隨著 4.0 版本的發布,MongoDB 也為我們帶來了原生的事務操作,下面就讓我們一起來認識它,并通過簡單的例子了解如何去使用。

 

 

 

[[249466]]

 

介紹

事務和副本集(Replica Sets)

副本集是 MongoDB 的一種主副節點架構,它使數據得到***的可用性,避免單點故障引起的整個服務不能訪問的情況的發生。目前 MongoDB 的多表事務操作僅支持在副本集上運行,想要在本地環境安裝運行副本集可以借助一個工具包——run-rs,以下的文章中有詳細的使用說明:

https://thecodebarbarian.com/...

事務和會話(Sessions)

事務和會話(Sessions)關聯,一個會話同一時刻只能開啟一個事務操作,當一個會話斷開,這個會話中的事務也會結束。

事務中的函數

  • Session.startTransaction()

在當前會話中開始一次事務,事務開啟后就可以開始進行數據操作。在事務中執行的數據操作是對外隔離的,也就是說事務中的操作是原子性的。

  • Session.commitTransaction()

提交事務,將事務中對數據的修改進行保存,然后結束當前事務,一次事務在提交之前的數據操作對外都是不可見的。

  • Session.abortTransaction()

中止當前的事務,并將事務中執行過的數據修改回滾。

重試

當事務運行中報錯,catch 到的錯誤對象中會包含一個屬性名為 errorLabels 的數組,當這個數組中包含以下2個元素的時候,代表我們可以重新發起相應的事務操作。

  • TransientTransactionError:出現在事務開啟以及隨后的數據操作階段
  • UnknownTransactionCommitResult:出現在提交事務階段

示例

經過上面的鋪墊,你是不是已經迫不及待想知道究竟應該怎么寫代碼去完成一次完整的事務操作?下面我們就簡單寫一個例子:

場景描述: 假設一個交易系統中有2張表——記錄商品的名稱、庫存數量等信息的表 commodities,和記錄訂單的表 orders。當用戶下單的時候,首先要找到 commodities 表中對應的商品,判斷庫存數量是否滿足該筆訂單的需求,是的話則減去相應的值,然后在 orders 表中插入一條訂單數據。在高并發場景下,可能在查詢庫存數量和減少庫存的過程中,又收到了一次新的創建訂單請求,這個時候可能就會出問題,因為新的請求在查詢庫存的時候,上一次操作還未完成減少庫存的操作,這個時候查詢到的庫存數量可能是充足的,于是開始執行后續的操作,實際上可能上一次操作減少了庫存后,庫存的數量就已經不足了,于是新的下單請求可能就會導致實際創建的訂單數量超過庫存數量。

以往要解決這個問題,我們可以用給商品數據“加鎖”的方式,比如基于 Redis 的各種鎖,同一時刻只允許一個訂單操作一個商品數據,這種方案能解決問題,缺點就是代碼更復雜了,并且性能會比較低。如果用數據庫事務的方式就可以簡潔很多:

commodities 表數據(stock 為庫存):

 

  1. "_id" : ObjectId("5af0776263426f87dd69319a"), "name" : "滅霸原味手套""stock" : 5 } 
  2. "_id" : ObjectId("5af0776263426f87dd693198"), "name" : "雷神專用鐵錘""stock" : 2 } 

 

orders 表數據:

 

  1. "_id" : ObjectId("5af07daa051d92f02462644c"), "commodity": ObjectId("5af0776263426f87dd69319a"), "amount": 2 } 
  2. "_id" : ObjectId("5af07daa051d92f02462644b"), "commodity": ObjectId("5af0776263426f87dd693198"), "amount": 3 } 

 

通過一次事務完成創建訂單操作(mongo Shell):

 

  1. // 執行 txnFunc 并且在遇到 TransientTransactionError 的時候重試 
  2. function runTransactionWithRetry(txnFunc, session) { 
  3.   while (true) { 
  4.     try { 
  5.       txnFunc(session); // 執行事務 
  6.       break; 
  7.     } catch (error) { 
  8.       if ( 
  9.         error.hasOwnProperty('errorLabels') && 
  10.         error.errorLabels.includes('TransientTransactionError'
  11.       ) { 
  12.         print('TransientTransactionError, retrying transaction ...'); 
  13.         continue
  14.       } else { 
  15.         throw error; 
  16.       } 
  17.     } 
  18.   } 
  19.  
  20. // 提交事務并且在遇到 UnknownTransactionCommitResult 的時候重試 
  21. function commitWithRetry(session) { 
  22.   while (true) { 
  23.     try { 
  24.       session.commitTransaction(); 
  25.       print('Transaction committed.'); 
  26.       break; 
  27.     } catch (error) { 
  28.       if ( 
  29.         error.hasOwnProperty('errorLabels') && 
  30.         error.errorLabels.includes('UnknownTransactionCommitResult'
  31.       ) { 
  32.         print('UnknownTransactionCommitResult, retrying commit operation ...'); 
  33.         continue
  34.       } else { 
  35.         print('Error during commit ...'); 
  36.         throw error; 
  37.       } 
  38.     } 
  39.   } 
  40.  
  41. // 在一次事務中完成創建訂單操作 
  42. function createOrder(session) { 
  43.   var commoditiesCollection = session.getDatabase('mall').commodities; 
  44.   var ordersCollection = session.getDatabase('mall').orders; 
  45.   // 假設該筆訂單中商品的數量 
  46.   var orderAmount = 3; 
  47.   // 假設商品的ID 
  48.   var commodityID = ObjectId('5af0776263426f87dd69319a'); 
  49.  
  50.   session.startTransaction({ 
  51.     readConcern: { level'snapshot' }, 
  52.     writeConcern: { w: 'majority' }, 
  53.   }); 
  54.  
  55.   try { 
  56.     var { stock } = commoditiesCollection.findOne({ _id: commodityID }); 
  57.     if (stock < orderAmount) { 
  58.       print('Stock is not enough'); 
  59.       session.abortTransaction(); 
  60.       throw new Error('Stock is not enough'); 
  61.     } 
  62.     commoditiesCollection.updateOne( 
  63.       { _id: commodityID }, 
  64.       { $inc: { stock: -orderAmount } } 
  65.     ); 
  66.     ordersCollection.insertOne({ 
  67.       commodity: commodityID, 
  68.       amount: orderAmount, 
  69.     }); 
  70.   } catch (error) { 
  71.     print('Caught exception during transaction, aborting.'); 
  72.     session.abortTransaction(); 
  73.     throw error; 
  74.   } 
  75.  
  76.   commitWithRetry(session); 
  77.  
  78. // 發起一次會話 
  79. var session = db.getMongo().startSession({ readPreference: { mode: 'primary' } }); 
  80.  
  81. try { 
  82.   runTransactionWithRetry(createOrder, session); 
  83. } catch (error) { 
  84.   // 錯誤處理 
  85. } finally { 
  86.   session.endSession(); 

 

上面的代碼看著感覺很多,其實 runTransactionWithRetry 和 commitWithRetry 這兩個函數都是可以抽離出來成為公共函數的,不需要每次操作都重復書寫。用上了事務之后,因為事務中的數據操作都是一次原子操作,所以我們就不需要考慮分布并發導致的數據一致性的問題,是不是感覺簡單了許多?

你可能注意到了,代碼中在執行 startTransaction 的時候設置了兩個參數——readConcern 和 writeConcern,這是 MongoDB 讀寫操作的確認級別,在這里用于在副本集中平衡數據讀寫操作的可靠性和性能,如果在這里展開就太多了,所以感興趣的朋友建議去閱讀官方文檔了解一下:

readConcern:

https://docs.mongodb.com/mast...

writeConcern:

https://docs.mongodb.com/mast... 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2009-08-10 18:16:33

ICustomQuer.NET 4.0

2009-08-19 16:51:14

C# 4.0 dyna

2009-09-04 16:28:05

ASP.NET 4.0

2009-05-26 09:28:22

C# 4.0dynamic動態類型

2009-12-30 10:21:36

.NET 4.0

2018-07-05 10:55:25

數據庫MongoDB 4.0多文檔事務

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2010-01-05 09:26:13

.NET 4.0

2010-08-17 09:57:39

C#

2010-02-24 14:24:35

.NET 4.0

2009-08-18 09:37:42

ASP.NET 4.0

2011-01-14 10:27:18

C#.netasp.net

2019-08-26 18:45:59

RedisRedis4.0數據庫

2009-07-06 11:00:56

.NET 4.0新特性.NET

2010-05-25 08:34:10

C# 4.0

2009-08-13 09:46:49

C#歷史C# 4.0新特性

2024-08-15 08:00:00

MongoDB數據庫NoSQL

2012-05-18 14:36:50

Fedora 17桌面環境

2009-01-16 10:01:57

MySQL復制特性測試

2012-06-13 01:05:53

JavaRubyJVM
點贊
收藏

51CTO技術棧公眾號

91精品啪在线观看国产18| 日韩电影免费观| www..com久久爱| 国产福利视频一区二区| 欧美激情图片小说| 欧美jizz19性欧美| 欧美日韩在线不卡| 热99这里只有精品| 麻豆影院在线| 久久蜜桃香蕉精品一区二区三区| 国产女人18毛片水18精品| 日韩免费黄色片| 国产精品97| 国产视频丨精品|在线观看| 91日韩精品视频| 婷婷电影在线观看| 一区二区成人在线观看| 天天人人精品| 国产a级免费视频| 亚洲欧美bt| 欧美人与性动交a欧美精品| 三区四区在线观看| 少妇一区二区三区| 精品第一国产综合精品aⅴ| 三上悠亚在线一区二区| 亚洲深夜视频| 亚洲超碰精品一区二区| 中国黄色录像片| 在线免费观看的av网站| 久久久久久久久岛国免费| 91麻豆国产精品| 久久国产香蕉视频| 久久精品日韩欧美| 97视频免费在线看| 国产一级在线免费观看| 欧美1区视频| 欧美成人手机在线| 欧美成人短视频| 国模精品一区| 中文字幕国内精品| 久久久久久久久久久久| 久久av免费看| 亚洲欧美精品suv| 水蜜桃av无码| 奇米777国产一区国产二区| 日韩精品一区二区三区中文不卡| 天天av天天操| 精品一区二区三区视频在线播放| 欧美美女喷水视频| 91视频这里只有精品| 久久久加勒比| 欧美精品在欧美一区二区少妇| 四季av一区二区| 成人精品动漫| 欧美精品久久一区| 欧美体内she精高潮| 亚洲综合网狠久久| 精品国产伦理网| 最新日本中文字幕| 久久夜色电影| 亚洲女人天堂色在线7777| 国产精品毛片一区二区| 国精一区二区| 久久国产一区二区三区| 国产精品丝袜一区二区| 欧美日本久久| 97精品欧美一区二区三区| 欧美bbbbbbbbbbbb精品| 久久精品首页| 国产裸体写真av一区二区| 国产露脸国语对白在线| 国产福利一区二区三区视频| 91丨九色丨国产在线| 性色av蜜臀av| 91视频一区二区三区| 欧美成ee人免费视频| 91啦中文在线| 一区二区三区中文字幕精品精品| 久久av综合网| 国产精品扒开腿做爽爽爽视频软件| 在线免费视频一区二区| 永久免费黄色片| 久久综合五月婷婷| 中文字幕日本精品| 免费网站观看www在线观| 国产欧美一级| 成人做爰www免费看视频网站| www香蕉视频| 久久综合久久综合亚洲| 做爰高潮hd色即是空| av漫画网站在线观看| 欧美视频一区在线| 日本中文字幕有码| 国产剧情在线观看一区| 欧美另类暴力丝袜| 久久久黄色大片| 国产一区中文字幕| 欧美极品一区二区| 午夜av在线播放| 91国模大尺度私拍在线视频| 欧美人与性动交α欧美精品| 伊甸园亚洲一区| 九色精品美女在线| 精品国产青草久久久久96| 国产成人一级电影| 亚洲免费不卡| 在线观看的黄色| 日韩三级精品电影久久久| 91成人在线免费视频| 国色天香一区二区| 91精品久久久久久久久久入口| 天堂在线视频免费观看| 亚洲欧美另类久久久精品| 日韩精品一区二区三区不卡| 77成人影视| 久久香蕉国产线看观看av| 不卡av电影在线| 99热精品一区二区| 精品国产av无码一区二区三区| 久久爱.com| 一区三区二区视频| 超碰超碰超碰超碰| 成人小视频在线| 国产日韩欧美大片| 日韩电影精品| 中日韩美女免费视频网址在线观看| 国产网址在线观看| 国产精品1024| 日韩中文在线字幕| 亚洲电影二区| 精品国产美女在线| 一区二区视频免费| 中文一区一区三区高中清不卡| 日本精品一区在线观看| 久久a爱视频| 欧美精品激情视频| 好男人www在线视频| 亚洲最大的成人av| 三上悠亚 电影| 外国成人免费视频| 成人写真福利网| 蜜桃av在线免费观看| 欧美揉bbbbb揉bbbbb| 精品人妻中文无码av在线 | 国产成人综合欧美精品久久| 成人一道本在线| 久久这里只有精品18| 国产精品黄网站| 91国自产精品中文字幕亚洲| 欧美自拍偷拍第一页| 精品电影在线观看| 亚洲天堂成人av| 奶水喷射视频一区| 日韩av一区二区三区在线| 日本精品网站| 色七七影院综合| 国产又粗又大又黄| 亚洲精品伦理在线| 亚洲自拍偷拍精品| 久久精品亚洲| 亚洲三区视频| 欧美黄视频在线观看| 欧美极品美女电影一区| 亚洲 欧美 激情 另类| 色婷婷综合久久久中文一区二区| 日韩欧美黄色网址| 激情深爱一区二区| 天堂8在线天堂资源bt| 亚洲专区视频| 国产日产欧美a一级在线| 成人在线观看免费网站| 欧美精品一区二区三区在线播放 | 国产欧美欧美| 深田咏美在线x99av| 96sao精品免费视频观看| 欧美激情xxxx性bbbb| 亚洲三区在线播放| 欧美片在线播放| 国产精品第一页在线观看| 久久亚洲精品小早川怜子| 免费一区二区三区在线观看 | 欧美精品在线观看| 偷拍精品一区二区三区| 欧美唯美清纯偷拍| 久久综合色综合| 久久精品夜色噜噜亚洲aⅴ| 亚洲综合日韩欧美| 亚洲激情一区| 亚洲欧美日韩精品久久久| 1204国产成人精品视频| 日本道色综合久久影院| h网站久久久| 亚洲男人天堂古典| www日本高清| 欧美在线综合视频| 五月婷婷激情网| 国产精品国产三级国产普通话99| 亚洲一级Av无码毛片久久精品| 蜜臀a∨国产成人精品| 精品丰满人妻无套内射| 色综合五月天| 久久久久一区二区| 欧美午夜网站| 国产精品日韩在线播放| 少妇在线看www| 欧美老少配视频| 性开放的欧美大片| 亚洲美女久久久| 亚洲精品国产精品乱码不卡| 欧美日韩在线三区| 亚洲欧美偷拍一区| 亚洲6080在线| 日韩在线中文字幕视频| 国产精品剧情在线亚洲| 精品人妻无码一区二区三区 | 第一av在线| 久久精品在线视频| 成年人视频在线看| 亚洲美女中文字幕| 四虎精品一区二区三区| 日韩欧美一区二区视频| 911美女片黄在线观看游戏| 日本道免费精品一区二区三区| 黄色小视频在线免费看| 一区二区三区视频在线看| 精品无码一区二区三区蜜臀| 中文一区二区完整视频在线观看| 黄色短视频在线观看| 成人动漫视频在线| 亚洲美女精品视频| 国产黄色精品网站| 色黄视频免费看| 都市激情综合| 高潮久久久久久久久久久久久久 | 国产清纯美女被跳蛋高潮一区二区久久w| 99国产精品白浆在线观看免费| 日韩欧美午夜| 日韩一区二区电影在线观看| 最新精品国偷自产在线| 欧美国产综合视频| 手机电影在线观看| 一区二区三区在线视频播放| 国产人与禽zoz0性伦| 中文子幕无线码一区tr| 亚洲精品成人无码| 欧美激情资源网| 免费成人美女女在线观看| 国产精品久久看| 亚洲xxxx3d动漫| 夜夜揉揉日日人人青青一国产精品| 中文字幕亚洲欧美日韩| 一区二区三区日韩在线观看| 久久艹精品视频| 午夜a成v人精品| 国产精品第5页| 欧美日韩在线一区二区| 91久久精品无码一区二区| 欧美一区二区私人影院日本| www.av在线.com| 亚洲黄色www| 黄色片在线播放| www.欧美三级电影.com| 精品孕妇一区二区三区| 欧美精品videos| 色戒汤唯在线观看| 国产精品自产拍在线观看中文| 24小时成人在线视频| 99国产视频| 在线日韩一区| 国产a级片免费看| 欧美日韩一卡| 日本精品免费在线观看| 免费视频一区二区| 色姑娘综合天天| 97久久精品人人澡人人爽| 成人小视频免费看| 一区二区三区在线视频播放| 国产在线观看黄色| 欧美人体做爰大胆视频| 色网站免费观看| 亚洲无线码在线一区观看| 制服丝袜在线播放| 全亚洲最色的网站在线观看| 日本电影久久久| 97在线资源站| 日韩激情免费| 9色porny| 美女任你摸久久| 国产chinese中国hdxxxx| 中文字幕av在线一区二区三区| 欧美日韩国产精品综合 | 免费在线黄网站| 男女精品网站| 国产精品偷伦视频免费观看了 | 精品福利av导航| av每日在线更新| 97碰在线观看| 电影中文字幕一区二区| 国产综合第一页| 久久久久久久久久久久久久| 国产熟女高潮视频| 国产精品羞羞答答xxdd| xxxx日本黄色| 欧洲毛片在线视频免费观看| 久久激情一区| 波多野结衣与黑人| 石原莉奈在线亚洲二区| 又大又长粗又爽又黄少妇视频| 国产日韩欧美综合一区| 国产一级淫片a| 在线播放中文一区| 国产系列在线观看| 久久人人爽人人爽人人片av高请| 日本亚洲欧洲无免费码在线| 欧美日韩一区二区视频在线| 激情成人综合| 日本中文字幕在线不卡| 国产精品成人免费在线| 无码人妻精品一区二区三区蜜桃91| 欧美videossexotv100| 欧美激情二区| 国产精品久久久久久久久久尿| 久久香蕉精品香蕉| 国产成人永久免费视频| 国产风韵犹存在线视精品| а天堂中文在线资源| 欧美在线观看你懂的| 九九九伊在人线综合| 欧美一级大片视频| 久久综合五月婷婷| 国产极品尤物在线| 成人亚洲一区二区一| 激情综合网五月天| 欧美成人性战久久| 亚洲丝袜一区| 超碰国产精品久久国产精品99| 亚洲无中文字幕| 超碰91在线播放| 亚洲卡通动漫在线| 精品国产av 无码一区二区三区 | 日韩成人一级大片| 日本黄色网址大全| 欧美性猛交xxxx偷拍洗澡| 涩爱av在线播放一区二区| 91成人在线视频| 亚洲人成网77777色在线播放 | 日韩精品一区二区三区国语自制| 日韩欧美国产一区二区在线播放 | 国产精品视频区| 91视频综合| 青娱乐精品在线| 亚洲国产一区二区在线播放| 成人免费观看在线视频| 久久久久免费视频| 国产乱论精品| 久久精品免费一区二区| 久久影院视频免费| 精品一区二三区| 北条麻妃在线一区二区| 精品入口麻豆88视频| 精品国产av无码一区二区三区| www.66久久| 性高潮视频在线观看| 久久久精品久久久久| 99久久人爽人人添人人澡| 国产二级片在线观看| 欧美国产精品一区二区三区| 亚洲综合精品国产一区二区三区 | 黄色一级片在线免费观看| 亚洲国产精品久久| 日韩不卡免费高清视频| 中文字幕剧情在线观看一区| 高清不卡在线观看av| 久久免费激情视频| 中文字幕久久久av一区| 日本一区二区三区视频在线看| 亚洲 欧美 日韩 国产综合 在线| 国产亚洲va综合人人澡精品 | 影音成人av| 熟女视频一区二区三区| 99精品国产一区二区三区不卡| 日韩精品一区不卡| 久久成人这里只有精品| 欧洲亚洲视频| www.五月天色| 日韩欧美第一页| av电影高清在线观看| 欧美一区二区视频17c| 国产美女娇喘av呻吟久久| 免费观看成人毛片| 久久艹在线视频| 岳的好大精品一区二区三区| 初高中福利视频网站| 在线一区二区三区四区五区| 天堂成人av| 五月天色一区| 91麻豆.com| 亚洲av永久纯肉无码精品动漫| 国产国语刺激对白av不卡| 亚洲香蕉网站|