2011-10-13 40 views

回答

3

如果不是輕浮,ACID的缺失意味着您無法保證原子性,一致性,隔離性或持久性。

沒有原子性,您不能保證多個操作必須成功或失敗。例如,如果您的交易要求您借記一個賬戶並一次性記入另一賬戶,那麼在沒有原子交易的情況下,您必須推出自己的解決方案,或者接受可能從您的賬戶中扣款,而無需相應的信用。

沒有一致性,不能保證事務的「副作用」 - 在關係數據庫中工作,就像觸發觸發器或外鍵關聯級聯一樣。所以,如果您的交易需要某種自動遞增的唯一標識符,則不能保證您會得到一個。如果沒有隔離,就無法保證兩個進程不會同時影響數據。例如,一個過程可能會增加一個領域的價值,另一個過程可能會減少它 - 誰贏?

沒有耐用性,硬件故障可能會使數據庫處於與您預期不同的狀態 - 例如,您可能認爲將更改寫入數據存儲區,但它在某些內部緩衝區中排隊,然後消失如果發生電源故障,則爲空氣稀薄。

在NoSQL上構建解決方案可能是可行的,該解決方案可以避免ACID合規性,但是工作量很大,而且幾乎可以肯定不會像編寫關係數據庫的人那樣做得很好...

+0

所有NoSQL數據庫至少有「d」 - 沒有人願意交易,如果電源熄滅消失。用'我',NoSQL的人不會問「誰贏了?」但是「用戶期望贏誰?」如果同時發生,用戶可能沒有任何期望。對於'A'(原子性),許多NoSQL數據庫提供了一種有限的交易形式,這通常會讓您借記一個帳戶並相信另一個帳戶,但它們不支持涉及100個對象的任意複雜交易。 –

-1

是的,會有數據丟失的風險,只有一個傻瓜纔會使用它來完成最終交易。

3

每個RDBMS傢伙都認爲天空沒有ACID會下降,但大多數NoSQL傢伙樂於部署和支持最終用戶應用程序,卻從未想過「我的應用程序對ACID會更好」,這是一個悖論。

(注:這個答案是類似於我給了非常類似的問題:What Applications Don't Need ACID?

大多數NoSQL數據庫的有「d」(耐久性)特性:電源的意外損失會離開您承諾的事務在數據庫中顯而易見,但有一點需要注意,從某種意義上說,NoSQL事務「小」。所以「否」:典型的NoSQL數據庫不會丟失數據。

在大多數NoSQL數據庫中,您可以使用有限版本的原子性&隔離等,但需要花費大量的精力來實現任意複雜性的事務。所以沒有理由不能使用非ACID數據庫來實現銀行系統:大多數NoSQL數據庫會允許您使用微型交易,從一個賬戶扣除資金並將其添加到另一個賬戶,其中0%的機會系統中的總金額發生變化。 (但是,作爲一個反例,我認爲銀行應用程序可能會在Google AppEngine中寫入而不是,因爲它們的交易只能在一個「複雜對象」內工作,該複雜對象將是單個用戶的一組銀行帳戶)。

爲了探討在現實世界的例子,對這一問題,我將介紹我們的應用程序。我公司向中學銷售軟件,主要用於時間安排,但也包括唱名,管理教師缺勤/替換,短途旅行和房間預訂。我們的軟件基於一個名爲Mrjb的內部開發的非ACID數據庫引擎(僅在內部可用),它具有NoSQL數據庫典型的侷限性。

與最終用戶相關的ACID和NoSQL之間的區別的一個例子是,如果2個用戶試圖在同一時間標記同一個卷,那麼最終結果將是非常小的可能性兩個用戶提交的數據的組合。 ACID數據庫可以保證最終結果是一個用戶的數據或另一個用戶的數據,或者一個用戶的更新可能會失敗並向用戶返回錯誤消息。

在這種情況下,我認爲我們的用戶不會在意個別學生的「缺席」狀態是否與一個用戶的更新或兩者的混合都是一致的,儘管他們會擔心如果我們將缺席狀態與兩個用戶的輸入相反。這個例子不應該在實踐中出現,如果它確實存在,那麼它就是一個「競爭條件」,對於我們相信哪個用戶基本上沒有正確的答案。

一個問題是有關提高到我們的數據庫Mrjb我們是否是能夠實施約束,如「一定不能讓一個學生對象沒有相應的家庭對象存在」。 ('ACID'中的'C'=一致性)。事實上,我們可以並且確實保持這種約束 - 微型交易的另一個例子。

又如上傳在其日常時間表是基於週期性學校時間表(典型的是2周的週期)的新版本時。我們很難將此更新事務設置爲原子級別,或者允許其他事務獨立於此更新執行。所以,我們基本上有一個選擇,要麼「阻止世界」,而這主要交易發生時,大約需要2秒,或者允許這種可能性,即學生打印關閉含更新前和更新後的數據組合的時間表(有可能會出現100ms的窗口)。 「停止世界」的選擇可能是更好的選擇,但實際上我們做後者。你可以說,混合時間表比更新前的時間表差,但在這兩種情況下,我們需要依靠學校有一個過程來通知學生的時間表已經改變 - 學生工作的關外的日期的時間表無論哪種方式都是一個大問題。

有關記錄,我們的公司在這裏描述:http://edval.com.au和我們的NoSql技術在這裏描述(描述爲一種技術):http://www.edval.biz/memory-resident-programming-object-databases。 (?)

相關問題