關於mongo原子操作的探討
眾所周知,Redis採用的是非同步I/O非阻塞的單程式模型,每一條Redis命令都是原子性的。那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢?
1.對單個文件的原子性修改
mongoDB保證了對單個document的多個filed的原子性修改。如果需要對單個文件進行原子性的CAS操作(check and set),可以使用findAndModify操作。
比如下面就是一條原子性的CAS操作,首先選擇_id為123的文件(注意這裡只選擇了一個文件),然後對計數器count加1,將status欄位變為true,並返回修改後的結果。
db.colleciton.findAndModify({query:{_id:'123'},$inc:{count:1},$update:{status:true}},new:true);
2.對多個文件使用$isolate操作符
$isolate
操作符可以對多個文件的修改提供隔離性。針對其他執行緒的併發寫操作,$isolate
保證了提交前其他執行緒無法修改對應的文件。針對其他執行緒的讀操作,$isolate
保證了其他執行緒讀取不到未提交的資料。
但是$isolate
有驗證的效能問題,因為這種情況下執行緒持有鎖的時間較長,嚴重的影響mongo的併發性。另外,$isolate
也無法保證多個文件修改的一致性(all-or-nothing),$isolate
失敗是可能只修改了部分文件。
3.從語意層面實現事務性操作
mongoDB官方提供了一種做法,即兩階段提交(two-phase commit),基本的原理就是利用了寫操作的冪等性。具體實現可以看官網的詳細講解。但是利用冪等性來實現事務性有一個重要的前置條件:業務不在乎中間態的不一致。冪等性可以保證最終的一致性,但是會出現中間的不一致狀態。
本文同時發表在我的部落格積木村の研究所 :http://foio.github.io/mongo-atom/
相關文章
- 關於java的“原子操作”問題Java
- 關於identity列的探討IDE
- 關於檔案寫入的原子性討論
- SEO關於探討URL的知識!
- 程寅:關於支付流程的探討
- 關於rman中set newname的探討
- 關於 performSelector 的一些小探討performSelector
- 關於python中slicing的探討Python
- 關於 DDoS 攻擊事件的探討(轉)事件
- 關於 Xmind 用例線上管理的探討
- 關於 Roguelike 的探討,及基於 Roguelike 的新框架框架
- 乾貨| 關於程式碼對齊的探討
- 關於volatile與指令重排序的探討排序
- 關於MSSQL中計算列上建索引的探討SQL索引
- 關於apache james郵件伺服器的探討Apache伺服器
- 關於.Net中屬性的使用探討(一) (轉)
- 關於.Net中屬性的使用探討(二) (轉)
- 關於 js 物件 轉 字串 和 深拷貝 的 探討JS物件字串
- 關於如何防止重複簽到的技術探討
- 【轉】關於oracle中Move機制的一點探討Oracle
- 關於多型實現Singleton模式的探討 (轉)多型模式
- 關於 RAC VIP (Oracle10G RAC) 的探討(zt)Oracle
- 我的理解——關於“ERP過時論”的探討(轉)
- 【Mongo】mongo聚合操作Go
- 原子操作 vs 非原子操作
- 關於結構體中指標的一些探討結構體指標
- 關於enq: TX - index contention 等待的探討與測試ENQIndex
- docker操作mongo+docker的常用操作+mongo與.netDockerGo
- 關於 PHP-fpm master 程式和 worker 職責探討PHPAST
- 關於C語言結構體對齊問題的探討C語言結構體
- 關於IE8下media query相容的解決方案探討
- 原子操作
- iOS 中關於列表滾動流暢方案的一些探討iOS
- 技能篇:關於快取資料的一致性探討快取
- C語言關於回撥函式和this指標探討C語言函式指標
- 原子操作與原子型別型別
- 探討BPM流程申請活動與退回操作的建模
- mongo基本操作Go