2012-01-04 67 views
0

在發佈問題here後,我瞭解到NoSQL在擴展方面更好,因爲它們在支持事務和可伸縮性之間進行折衷。在什麼情況下支持交易並不重要?

所以我在使可擴展性,更優選以支持交易的什麼情況下的交易並不是那麼重要奇怪?

+0

嗯RavendDB支持[交易](http://ravendb.net/faq/working-with-dtc) – oleksii 2012-01-04 16:23:40

回答

2

那麼,我會先說NoSQL在縮放比較好的情況下是有些情況,但不是全部。

完整的ACID交易是原子性,一致性,隔離性和耐久性。如果您丟失了交易,您將丟失數據存儲區中的部分或全部ACID。

有許多方法可以使用其他異步系統(如消息隊列)來恢復這些功能,這些異步系統本身很耐用。您可以將數據推送到一個持久的消息隊列中,彈出數據並在NoSQL中處理它,然後,當您可以確認它存儲到您所需的最小值時,可以將消息標記爲已消耗。這是ACID中的D,但是是分佈式的和異步的。有辦法確保其他人,但他們往往在一定程度上被犧牲,或移到系統中的另一個地方。對於一些NoSQL解決方案,您只需將一致性移入應用程序,以便它不會嘗試存儲無效數據。

當你開始從數據庫驅動的交易移開,就必須大大提高您的應用程序測試,以確保您的系統不會失敗(對於失敗的一些值)。

有本質上沒有的情況下交易,約束不是在一個系統中同時具有讀寫的要求很重要。如果他們不是,你根本不會關心你的數據(有些人不會,但後來會後悔的)。然而,有「關愛」的水平。這只是一個問題,如何最終導致ACID或某種「足夠好」的僞ACID。 RDMBS讓您的數據更便宜。 NoSQL讓您的數據更加昂貴,但是,它使得擴展更便宜(呃)(在某些情況下)。在RDBMS中有很多公司擁有多TB的數據庫,所以單方面說「他們不擴展」是不準確的。但是,數TB的SQL數據庫可能會花費很多錢,具體取決於用例(畢竟只需用一些3TB驅動器將一個RAID 10陣列放到計算機上並將數據庫引擎放在上面就可以了。幾個小時就可以在一張大桌子上進行任何類型的表格掃描,甚至可以通過索引查找,但是如果你不在意,它便宜且數TB)。

0

最大的類別只讀型的查詢,其中一個被中止或拙劣的交易可以簡單地重複。任何你正在改變基礎狀態,或者想要保證一次且只有一次活動,都應該有適當的事務語義。

那就是「我要訂購一種小工具,我的信用卡收取」應該是一個合適的交易:我不希望我的卡收費,除非小部件是有序的,並且供應商不希望小部件做派除非卡被充電。 「報告訂單xyz的貨運狀態」不需要是交易性的 - 如果我沒有得到答案,我可以重新加載。

+1

它不是拙劣或中止交易,這是隻讀查詢中的問題。如果您需要在單個事務中讀取多個信息,並且其他事務同時更改了數據,則會出現問題。你最終從一個說A的地方讀取數據,但接下來的讀取會以B結束,給應用程序提供衝突的信息。這種情況是我避免使用SQL Server的原因,因爲使用快照隔離是一件痛苦的事情,並且讀取已提交可能導致長時間運行事務的鎖定問題非常嚴重 – PlexQ 2012-01-04 16:26:17

0

其中的很大一部分只是側面思考。 整個交易點是你包裝了幾個操作,如果任何失敗的所有成功回滾,並且在交易正在進行時,記錄被鎖定,除非你已經閱讀未提交,你沒有看到任何關於狀態的個別變化,直到交易實施。

盡一切與分佈式系統是昂貴的,因爲你需要一個「中央」,難以需要「知道」所有關於其他的刻度點。

所以改爲或訂購此,充電我的卡,並顯示我目前的餘額。

你確實試過訂購這個,如果它是扣除我的卡的費用,並且我的卡被充電,那麼當前已知的餘額就是這個。 存在風險,訂單將被放置,付款失敗,所以你需要處理。卡的提議餘額存在風險,我不完全準確,因此增加了黃鼠狼的詞彙,並顯示付款的潛在影響,而不是結果。

事務並不重要,它看起來是因爲它們在NoSQL系統中沒有得到很好的支持,在哪裏/如何避免使用它們。

相關問題