2013-03-23 85 views
0

MoongoDB來自NoSql時代,Lock是與RDBMS相關的東西嗎? from Wikipedia爲什麼在MongoDB中使用鎖定?

樂觀併發控制(OCC)是關係數據庫管理系統併發控制方法......

那麼,爲什麼我在PyMongo is_locked發現,甚至在駕駛員使非阻塞呼叫,鎖定仍然存在,電機有is_locked

回答

1

MongoDB實現了一個數據庫級鎖定系統。這意味着非原子操作將鎖定在每個數據庫級別,與SQL不同,因爲大多數技術都鎖定在表級別上進行基本操作。

就地更新只發生在某些運營商 - $set是其中之一,MongoDB文檔曾經有一個頁面顯示所有這些頁面,但我現在找不到它。

MongoDB當前實現讀/寫鎖,每個鎖都是分開的,但它們可以互相阻塞。

鎖對於任何數據庫都是至關重要的,例如,如果當前正在寫入文檔,如何確保文檔的一致性讀取?如果您寫入文檔,您如何確保您只同時應用該單一更新,而不是同時進行多個更新?

我不確定版本控制如何在CouchDB中阻止這種情況,對於一致的讀取來說鎖確實非常重要,並且與版本控制是分開的,即如果您希望將讀鎖應用於同一版本或讀取文檔目前正在寫入新版本?您將很明顯看到鎖定隊列出現。儘管版本控制可能對寫入鎖定飽和有所幫助,但仍然會有寫入鎖定,並且仍然需要在一個級別上工作。

至於併發功能;如果數據不在RAM中,MongoDB有能力支持其他操作。這意味着鎖不會等待數據被分頁,其他操作將同時運行。

作爲一個方面說明,MongoDB實際上擁有比這更多的鎖,它也有一個全局和阻塞的JavaScript鎖,它沒有普通鎖的正常併發特性。

,甚至在駕駛,使非阻塞調用

嗯,我想你可能會被什麼意思爲「非阻塞」應用程序或服務器相混淆:http://en.wikipedia.org/wiki/Non-blocking_algorithm

+0

sorry但是我不關注你在非阻塞和鎖定數據庫中,當數據庫鎖定自身時,非阻塞是無用的嗎? – 2013-03-24 00:12:30

+1

@AbdelouahabPp非阻塞是應用程序/服務器的一個功能,它不是無用的,因爲它關心應用程序如何運行以及它如何處理自己的數據。嗯,想象兩個PHP進程爭奪同一個腳本,儘管你沒有看到它,但是在啓動已經運行的新腳本時存在輕微的「鎖定」延遲,在非阻塞應用程序中,這不會例如 – Sammaye 2013-03-24 03:33:08

+0

所以我想,如果process1試圖做一個數據庫調用,並發現mongodb鎖定,它立即說這樣的話:嘿,process2,現在輪到你試試了嗎? – 2013-03-24 13:41:39

2

NoSQL並不意味着自動沒有鎖。 總是有一些操作需要鎖定。

對於指數的例子建設

和官方MongoDB的文檔,然後更可靠的來源維基百科(沒有冒犯的意思維基百科:))

http://docs.mongodb.org/manual/faq/concurrency/

+0

似乎複製品會變得更復雜! RDBMS中的 – 2013-03-23 00:31:37

+0

一致性由鎖管理,因此這裏的一致性僅適用於索引? – 2013-03-23 00:37:34

+0

即使在NoSql中也存在樂觀和悲觀併發感,但每個DBMS都有自己的策略 – 2013-03-23 00:54:04

2

蒙戈確實就地更新,所以它需要鎖定才能修改數據庫。還有其他需要鎖定的東西,所以請閱讀@Tigra提供的鏈接以獲取更多信息。

就數據庫而言,這是非常標準的,它不是一個RDBMS特定的事情(Redis也是這樣做的,但是基於每個密鑰)。

有實現收藏級(而不是數據庫級)鎖定計劃:https://jira.mongodb.org/browse/SERVER-1240

有些數據庫,像CouchDB中,僅追加新的文件得到解決鎖定問題。他們創建一個新的唯一版本ID,一旦文檔寫完,數據庫就指向新版本。我確信在更改使用哪個修訂版本時會有某種併發控制,但它不需要阻止數據庫來執行此操作。這有一些缺點,例如compaction需要定期運行。

+0

因此每個DBMS都有自己的技術來減少鎖? – 2013-03-23 00:30:28

+1

@AbdelouahabPp - 我不是數據庫專家,但它似乎取決於數據庫是如何實現的。鎖定通常是一種折衷,以保證更快的查詢速度(慢速寫入與慢速讀取)。請訪問http://dba.stackexchange.com獲取專家意見。 – tjameson 2013-03-23 00:40:32

相關問題