1. 程式人生 > >什麼是MongoDB原子操作

什麼是MongoDB原子操作

原子操作

MongoDB 並不支援多文件原子事務(multi-document atomic transactions)。但它提供了針對單個文件的原子操作。假如一個文件包含數百個欄位,則 update 語句將更新所有的欄位,或者一個也不更新,從而維持了文件級的原子性。

原子操作資料模型
維持原子性的建議方法是利用內嵌文件(embedded document)將所有經常更新的相關資訊都儲存在一個文件中。這能確保所有針對單一文件的更新具有原子性。

考慮下列關於產品的文件:

{
   "_id":1,
   "product_name": "Samsung S3",
   "category": "mobiles",
   "product_total": 5,
   "product_available": 3,
   "product_bought_by": [
      {
         "customer": "john",
         "date": "7-Jan-2014"
      },
      {
         "customer": "mark",
         "date": "8-Jan-2014"
      }
   ]
}
在這個文件中,將購買產品的顧客的資訊內嵌在 product_bought_by 欄位中。無論何時,只要新顧客購買產品,我們就能使用 product_available 欄位檢視產品是否還有足夠的數量。如果產品還有,就減少 product_available 欄位值,並且將新顧客的內嵌文件插入到 product_bought_by 欄位中。使用 findAndModify 命令來實現該功能,因為它能同時搜尋並更新文件。

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, 
      $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} 
   }    
})
上述內嵌文件並使用 findAndModify 查詢的方法確保了,只有當產品還有足夠數量時,才更新產品購買資訊。在整個過程中,同一查詢中的事務是原子性的。

與之相反的情況是,我們可能會想分別保持產品可用性與購買產品的顧客資訊。在這種情況下,我們會首先使用第一個查詢來檢查產品是否夠用。然後在第二個查詢中更新購買資訊。但在這兩個查詢的執行過程之間,其他一些顧客也可能會購買了產品,從而使產品變得不夠用了。由於沒有了解到這種情況,我們的第二個查詢根據第一個查詢的結果進行了更新。這將造成資料庫的不一致性。

相關推薦

MongoDB 原子操作

sha 存在 lec tid collect 但是 事務 位操作 gpo mongodb不支持事務,所以,在你的項目中應用時,要註意這點。無論什麽設計,都不要要求mongodb保證數據的完整性。 但是mongodb提供了許多原子操作,比如文檔的保存,修改,刪除等,都是原子操

什麼是MongoDB原子操作

原子操作 MongoDB 並不支援多文件原子事務(multi-document atomic transactions)。但它提供了針對單個文件的原子操作。假如一個文件包含數百個欄位,則 update 語句將更新所有的欄位,或者一個也不更新,從而維持了文件級的原子性。原子操

MongoDB:14-MongoDB- 原子操作

Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢? Mo

linux系統原子操作

帶來 incr 利用 隱患 初始 pre ack 簡單 title 一、概念 原子操作提供了指令原子執行,中間沒有中斷。就像原子被認為是不可分割顆粒一樣,原子操作(atomic operation)是不可分割的操作。 c語言中一個變量的自加1操作,看起

linux 原子操作

ons i/o tom 有效 make 編譯 控制 tile 不能 原子操作 原子操作,顧名思義,就是說像原子一樣不可再細分不可被中途打斷。一個操作是原子操作,意思就是說這個操作是以原子的方式被執行,要一口氣執行完,執行過程不能夠被OS的其他行為打斷,是一個整體的過程

linux無鎖化編程--__sync_fetch_and_add系列原子操作函數

arc simple size 設計 spa true void 編程算法 lan linux支持的哪些操作是具有原子特性的?知道這些東西是理解和設計無鎖化編程算法的基礎。 下面的東西整理自網絡。先感謝大家的分享! __sync_fetch_and_add系列的命

信號燈 ManualResetEvent 與 Interlocked.Increment 原子操作使

ons timeout manage pre 事件 ren void 繼續 args class Program { public static int numb = 0; public static int numbb =

Mongodb基本操作入門,增刪改查和索引

less multi zhang 一個 attribute var sin 第一個 base 主要進程 mongod.exe為啟動數據庫實例的進程。 mongo是一個與mongod進程進行交互的JavaScript shell進程,它提供了一些交互的接口函數用戶

i++是否原子操作?並解釋為什麽?

多核 什麽 cpu 指令 操作 nbsp 解釋 心情 匯編指令 都不是原子操作。理由: 1.i++分為三個階段: 內存到寄存器寄存器自增寫回內存這三個階段中間都可以被中斷分離開. 2.++i首先要看編譯器是怎麽編譯的, 某些編譯器比如VC在非優化版本中會編譯為以下匯編代碼

Java並發——原子變量和原子操作與阻塞算法

index 復雜 多線程 保護 註意 java並發 edm urn 相同 十五年前,多處理器系統是高度專用系統,要花費數十萬美元(大多數具有兩個到四個處理器)。現在,多處理器系統很便宜,而且數量很多,幾乎每個主要微處理器都內置了多處理支持,其中許多系統支持數十個或數百個處理

臨界數據、臨界區和原子操作

png .com 修改 blog 概念 數據 競爭 es2017 實例 1、首先給出這三個名詞的定義。 臨界數據指多個進程(或線程)會競爭修改的數據。 臨界區指修改臨界數據的代碼區域。 原子操作指臨界區的代碼不會被這個臨界數據的其他臨界區的代碼打斷。 2、通過一個實例來理解

mongodb 集合操作 (增刪改查)

有變 添加 port strong ner 速度 遊標 基礎 ror 1、插入: 使用insert或save方法想目標集合插入一個文檔: db.person.insert({"name":"ryan","age":30}); 使用batchInser

MongoDB 基本操作學習筆記

一個 返回 show fin and 格式 style 排序 ons // 查看所有數據庫 show dbs // amdin 0.000GB // local 0.000GB // 使用數據庫 use admin // switched to db

MongoDB常用操作命令

叠代 lai 運行 分頁 save 沒有 函數 foreach username MongoDB常用操作命令 如果你想創建一個“myTest”的數據庫,先運行use myTest命令,之後就做一些操作(如:db.createCollection(‘user‘)),這樣就可以

多線程編程之原子操作

簡單 bsp idt 進行 gin 復制代碼 effect lean cati 在多線程環境中,對共享的變量的訪問,可以使用基於Compare And Swap這種lock free的技術進行實現,這種實現的好處是效率高。 一、原子操作摘錄 1.1 Android   源碼

22.原子操作

自增 locked col lock winapi system fin dword ret 變量自增 1 InterlockedIncrement(&num); 變量加一個指定數 1 InterlockedAdd(&num, 100);

mongodb查詢操作分析

stats rec dex mes sub n) 方法 3.1 and 背景 mongodb 提供了類sql的數據查詢及操作方式,同時也包含了聚合操作、索引等多個機制; 按以往的經驗,不當的庫表操作或索引模式往往會造成許多問題,如查詢操作緩慢、數據庫吞吐量低下、CPU或磁盤

原子操作類(一)原子操作類詳細介紹

expected 文章 span del 也有 pair 上一個 ride 操作類 引言 ??Java從JDK1.5開始提供了java.util.concurrent.atomic包,方便程序員在多線程環境下,無鎖的進行原子操作。原子變量的底層使用了處理器提供的原子指令,但

深入理解Atomic原子操作和volatile非原子

log tile 修飾 深入 clas 同時 結果 一個 body 原子操作可以理解為: 一個數,很多線程去同時修改它,不加sync同步鎖,就可以保證修改結果是正確的 Atomic正是采用了CAS算法,所以可以在多線程環境下安全地操作對象。 volatile是Java的關鍵

Unix系統編程()原子操作和競爭條件

例子 one cpu order https alt left 發生 see 競爭狀態是這樣一種情形:操作共享資源的兩個進程(或線程),其結果取決於一個無法預期的順序,即這些進程獲得CPU使用權的先後相對順序。 以獨占的方式創建一個文件 當同時指定了O_EXCL和O