2012-04-07 96 views
5

使用分片,您如何在多個數據庫服務器之間維護可靠的事務?例如,如果我在一個數據庫服務器(MySQL實例)上有一個名爲AccountLedger的表,並且在另一個數據庫服務器上有一個名爲User的表,是否可以跨兩個數據庫實例運行事務,這兩個數據庫實例都可以可靠地提交,或者回滾失敗?使用MySQL進行分片和事務

例事務:

AccountLedger數據庫服務器:

START TRANSACTION; 
INSERT INTO AccountLedger SET 
    UserID = @UserID, 
    Date = @Date, 
    Debit = @Debit, 
    Balance = @Balance; 

用戶數據庫服務器:

START TRANSACTION; 
UPDATE User SET 
    Balance = @Balance 
WHERE UserID = @UserID; 

AccountLedger數據庫服務器:

COMMIT; 

用戶數據庫服務器:

COMMIT; -- What happens if the COMMIT fails here (power goes out or whatever) 

我讀過不少關於分片,但我似乎無法找到關於使用交易與分片的任何信息。有人能指引我朝着正確的方向嗎?

回答

8

有可能通過分佈式交易做到這一點。它們受InnoDB存儲引擎的支持。您將在MySQL文檔中找到更多關於它們以及命令語法的信息:XA Transactions

我建議不要直接使用它們。如果一致性是ypur應用程序的最大要求,那麼請使用可以處理它的事務監視器。 Java EE爲你做到了這一點。

但是,如果可用性比一致性更重要,則應該避免分佈式事務。 CAP定理解釋了原因。

0

聲明:我ScaleBase(http://www.scalebase.com),在ScaleBase爲分片

我們一個完整的解決方案的供應商合作,給使用XA使用交易InnoDB的選擇,儘管我們發現它們的性能可能會很高......並且恰好在您需要數據庫成爲最快的地方(大規模插入等)。所以我們也啓用了「我們的兩階段提交版本」,它的速度更快,並且在一致性方面可能被認爲與XA非常接近,並且可能足以進行權衡......這個「我們的版本」包括一個快速「是否可用」查詢,如SELECT version()到所有參與的數據庫,然後提交它們。這是對我們的「ScaleBase數據庫流量控制器」中的其他機制的補充,對於我們的大多數客戶(以及不是那些 - 仍然可以選擇完整的XA)來說已經足夠了。

3

如果每個分片支持每個鍵的線性化並進行比較和設置(這對於MySQL是正確的),則可以在客戶端實現交叉分片可序列化事務。這種方法在Google's PercolatorCockroachDB中使用,但沒有任何東西阻止你將它與MySQL一起使用。

我已創建此類交易的step-by-step visualization。我希望它能幫助你理解它們。

如果你對讀取提交的隔離級別很好,那麼看看Peter Bailis的RAMP transactions是有道理的。它們也可以在分散的MySQL環境中實現。