具體是否存在數據可能丟失的一些風險?我正在考慮運行一個密集的事務處理系統,在這個系統中不會丟失任何東西。 NoSQL是否在任務關鍵型應用程序(如銀行交易處理)中使用過任何示例?非ACID數據庫合規性對現實世界的影響是什麼?
回答
如果不是輕浮,ACID的缺失意味着您無法保證原子性,一致性,隔離性或持久性。
沒有原子性,您不能保證多個操作必須成功或失敗。例如,如果您的交易要求您借記一個賬戶並一次性記入另一賬戶,那麼在沒有原子交易的情況下,您必須推出自己的解決方案,或者接受可能從您的賬戶中扣款,而無需相應的信用。
沒有一致性,不能保證事務的「副作用」 - 在關係數據庫中工作,就像觸發觸發器或外鍵關聯級聯一樣。所以,如果您的交易需要某種自動遞增的唯一標識符,則不能保證您會得到一個。如果沒有隔離,就無法保證兩個進程不會同時影響數據。例如,一個過程可能會增加一個領域的價值,另一個過程可能會減少它 - 誰贏?
沒有耐用性,硬件故障可能會使數據庫處於與您預期不同的狀態 - 例如,您可能認爲將更改寫入數據存儲區,但它在某些內部緩衝區中排隊,然後消失如果發生電源故障,則爲空氣稀薄。
在NoSQL上構建解決方案可能是可行的,該解決方案可以避免ACID合規性,但是工作量很大,而且幾乎可以肯定不會像編寫關係數據庫的人那樣做得很好...
是的,會有數據丟失的風險,只有一個傻瓜纔會使用它來完成最終交易。
每個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。 (?)
- 1. 什麼是POSIX合規性,它對我有什麼影響?
- 2. 什麼是Redis數據庫索引對性能的影響
- 3. 什麼是聚合的現實世界比喻?
- 4. 單位對現實世界
- 5. get_defined_vars()`對性能的影響是什麼?
- 6. 熊貓非獨特索引對性能的影響是什麼?
- 7. TDE支持對數據庫性能有什麼影響?
- 8. 數據庫標識符結尾處的世界是什麼.WORLD?
- 9. ACID和非ACID SQL有什麼不同?
- 10. 什麼是C++多繼承的現實世界的例子?
- 11. 什麼影響在數據庫中null?
- 12. 爲什麼NoSQL數據庫不符合ACID標準?
- 13. DataFrame.loc()對數據框有什麼影響?
- 14. 什麼是ACID的真實例子?
- 15. 什麼是實現這個數據庫
- 16. 關係陣營和「現實世界」數據庫開發
- 17. 如何在NoSQL世界中實現數據庫抽象/獨立性
- 18. 適合地圖展現世界總是
- 19. 數據庫的SQL Server和ACID屬性
- 20. 什麼是爲應用程序設置數據庫的更好方法?標準化與現實世界
- 21. getElementsByTagName(「*」)的性能影響是什麼?
- 22. LoadControl的性能影響是什麼?
- 23. 分片的性能影響是什麼?
- 24. 現實世界的嵌套函數
- 25. 對生產mongo數據庫運行db.copyDatabase()會有什麼樣的性能影響?
- 26. AsEnumerable()對LINQ實體有什麼影響?
- 27. setPrototypeOf對新對象的性能影響是什麼?
- 28. 什麼是非規範化mysql數據庫的好方法?
- 29. 類別對實現協議的類有什麼影響?
- 30. 在世界上重複對塊的影響
所有NoSQL數據庫至少有「d」 - 沒有人願意交易,如果電源熄滅消失。用'我',NoSQL的人不會問「誰贏了?」但是「用戶期望贏誰?」如果同時發生,用戶可能沒有任何期望。對於'A'(原子性),許多NoSQL數據庫提供了一種有限的交易形式,這通常會讓您借記一個帳戶並相信另一個帳戶,但它們不支持涉及100個對象的任意複雜交易。 –