11-【MongoDB入門教程】MongoDB原子性和事務

來源:互聯網
上載者:User

標籤:

在MongoDB中,寫操作的原子性是在document層級上的,即使修改的是文檔中的內嵌部分,寫鎖的層級也是document上。

當一個寫操作要修改多個文檔,每個文檔的修改是原子性的。整個的寫操作並不是原子性的,它可能和其他寫操作產生交織。然而你可以使用$isolated隔離操作符來限制寫操作,讓它不與其他寫操作交織。 不隔離效能更高,但是會產生資料的不確定性,隔離寫操作,事務性更好。MongoDB把這個層級完全由使用者控制。

隔離寫操作

MongoDB使用$isolated操作符來隔離寫操作。如果一個寫操作要更新多個文檔,它能防止其他進程與本次寫操作交錯。直到這個寫操作完成,其他進程才能寫。

但是,$isolated算不上一個事務,如果在寫的過程中發生錯誤,MongoDB並不會復原已經寫的資料。$isolated也不能在分區叢集上工作。

特性:

  • 隔離不支援分區叢集
  • 不支援“all-or-nothing”特性
  • MongoDB2.2版本後$isolated被替換成$atomic
類事務文法

MongoDB並不支援關係型資料庫中的那種事務特性,為了效能著想,它把這個特性交給程式員去實現。這就是MongoDB官方所講的Two Phase Commits兩階段交易認可。這個技術雖然在一定程度上能保證資料最終的一致性,但是應用程式還是可能會讀到提交或者復原過程中的中間資料。對於這個技術如果有興趣可以讀一讀原文。

並發控制

並發控制允許多個應用程式層程式同時訪問資料庫,而不引起資料不一致或衝突。

MongoDB中提到兩種技術來解決這個問題。第一種是唯一索引,第二種是叫Update if Current

用唯一索引來防止多個進程重複插入或者更新導致的重複的值。
Update if Current意思是說在更新資料的時候,在更新條件裡給定一個期望的值(這個值是先查詢出來的),用來防止在更新之前其他進程已經將此值更新。看一個例子:


var myDocument = db.products.findOne( { sku: "abc123" } );if ( myDocument ) { var oldQuantity = myDocument.quantity; var oldReordered = myDocument.reordered; var results = db.products.update( { _id: myDocument._id, quantity: oldQuantity, reordered: oldReordered }, { $inc: { quantity: 50 }, $set: { reordered: true } } ) if ( results.hasWriteError() ) { print( "unexpected error updating document: " + tojson(results) ); } else if ( results.nMatched === 0 ) { print( "No matching document for " + "{ _id: "+ myDocument._id.toString() + ", quantity: " + oldQuantity + ", reordered: " + oldReordered + " } " ); }}

同樣的,在findAndModify()函數中:


db.people.findAndModify({ query: { name: "Andy" }, sort: { rating: 1 }, update: { $inc: { score: 1 } }, upsert: true})

如果有多個進程同時調用此函數,這些進程都完成了查詢階段,如果name欄位上沒有唯一索引,upsert階段的操作,多個進程可能都會執行。導致寫入重複的文檔。

11-【MongoDB入門教程】MongoDB原子性和事務

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.