從分佈式/複製數據庫中同時取款
可以說我有 $ 10 in my bank account. The database is replicated in North America and Asia. At the exact same time I do a withdrawl of $ 10 在北美和亞洲,這意味著我的撤回將對兩個不同的數據副本起作用。如何防止我最終達到以下平衡 - $ 10 and $ 20在我的口袋裡?
是否可以使用 NoSQL 產生正確的結果?
(我不是數據庫專家,只是好奇)
謝謝!
在此處查看 Micheal Stonebraker 的觀點- 第 21 和 22 頁。Stonebraker在數據庫領域(Postgres、Vertica、Informix、VoltDB 等)既是學術參與者,也是嚴肅的商業參與者。對於您的特定問題,請注意他對銀行業的看法。
Stonebraker 是“ NewSQL ”的倡導者。
NewSQL 是一種雙管齊下的方法,它解決了數據庫處理的兩個基本方面:OLTP和OLAP。
- 對於 OLTP(銀行、購物),他提出了記憶體、分片、無共享架構,沒有“OldSQL”的事務/緩沖成本(對你和我來說就是 Oracle、SQL Server、MySQL 等)。他在這方面的產品是 VoltDB。甲骨文和微軟正在迎頭趕上(In-Memory和Hekaton)
- 對於 OLAP (DW) 應用程序,他是面向列的商店的粉絲 - 即Vertica(他出售給 HP 的商業成功)。
他主要說了兩點:
- ACID對於數據庫系統是必不可少的(參見 .pdf),並且
- SQL 沒有任何問題——高級語言很好,NoSQL 基本上是 30 年前的一次巨大飛躍。
他提出了一個很好的觀點,早在 1970 年代,CS/IT 世界就存在關於 C 與彙程式序的爭論。有些人認為手工彙程式序(想想 Map-Reduce 程序)會比 C 編譯器的輸出(想想數據庫查詢優化器)更有效。
您可能已經猜到了,我是 Stonebraker 的忠實粉絲。
簡短的回答
在分佈式系統中,無法阻止您同時提款。如果您想防止同時發生事務,請不要使用分佈式系統。
澄清
“分佈式系統”是指一個系統,其中兩個或多個不同的組件可以在不等待系統其餘部分確認的情況下進行操作。兩階段送出不是分佈式的,因為雖然它可能涉及物理上不同的系統通過傳遞消息進行通信,但事務仍然必須等待所有成員的確認。
我認為我的意思的正確術語是“鬆散耦合”,但 DbQuestioner88在問題中使用了術語“分佈式系統”,所以我在答案中使用了它。
軼事
紐西蘭曾經有一家銀行,其自動取款機在斷開連接時會執行。如果 ATM 無法聯繫中央電腦系統,它仍然允許提取高達 40 美元。當它稍後連接時,中央系統將收集所有這些變化。如果提款意味著您現在處於透支狀態,那麼您就處於透支狀態,並且可能需要支付一些利息。
銀行這樣做是為了即使電腦網路出現故障(這種情況並不經常發生,即使在 80 年代也是如此),您仍然可以為雜貨、計程車回家和小型緊急情況等事情提取現金。
每個 ATM 每個帳戶只會執行一次此操作,因此如果您想濫用它,則必須在許多 ATM 之間快速移動,這不划算。一些人仍然濫用它,但銀行將此視為提供這種額外服務的成本。無論如何,您仍然必須償還透支。