2013-10-11 84 views
3

我目前正在建立一個龐大規模的數據庫,其中有許多交易。 (插入,更新,選擇)使用MySQL MyISAMMySQL鎖定系統

而我正在考慮對敏感表使用LOCK TABLE和UNLOCK TABLE。如果發生以下情況,會發生什麼情況:

用戶A有一個更新過程(首先鎖定表),並且在過程中,用戶B和用戶C試圖訪問同一個表和行(不管它是更新/選擇)。

  • B和C會立即得到關於表被鎖定的SQL錯誤嗎?
  • MySQL在返回錯誤之前是否有鎖定超時?如果發生鎖定超時,我如何檢查服務器中的鎖定超時?
  • 比鎖定表格更好的解決方案嗎?我們正在考慮創建一個工作隊列表。但我認爲表演會非常糟糕。

該表確實是敏感的,它會搞砸了,如果我不能阻止這個

謝謝您的回答

+1

聽起來對你來說,你最好使用'InnoDB'引擎,因爲它支持事務和行級鎖定 – Stephan

+0

MyISAM不能做事務。我建議你使用MariaDB或Percona,它更加穩定,默認情況下具有更好的鎖定功能。您不必進行任何手動鎖定。您的備份可能性始終是'backlog'和複製。 – DanFromGermany

+0

您是否需要了解引擎類型及其怪癖,或者您是否想要根據您的規範檢查實施作業隊列的最佳方法? –

回答

1

要回答你的問題 - B & C被阻塞,直到超時。我現在找不到MyISAM的超時設置 - 它在InnoDB的mysqld.conf中設置。

正如其他人所說 - 如果您需要交易支持,InnoDB是一個更好的引擎。

然而,考慮你是否真的需要鎖。它們在性能上造成不可預知的瓶頸,尤其是在具有許多併發用戶的系統中。雖然表級鎖不應導致可怕的deadlock方案,但表級鎖意味着只有一個進程可以隨時使用該表;如果每個數據庫操作需要1秒(在大型數據庫中不是不合理),則系統中超過2個併發用戶會注意到性能下降; 10個併發用戶會看到系統變得非常慢,特別是如果您必須跨多個表加入。

在大多數情況下,交易是一個更好的解決方案。

+0

嗨內維爾,謝謝你的回答。 「B&C被封鎖」是指什麼?它會在隊列中(A將運行,然後B和C)?或者交易將被阻止並返回錯誤? –

+0

他們將等待鎖定釋放。 MyISAM似乎沒有超時設置,所以他們可以永遠等待... –

3

,如果你想高效地擴展更不要使用MyISAM存儲引擎處理併發問題。選擇InnoDB而不是MyISAM的主要原因是MyISAM使用每個表鎖(這將成爲性能的瓶頸),而InnoDB實現MVCC(多版本併發控制),這意味着鎖定在行級別。

另外MyISAM不支持交易,並且需要手動修復表格結果。