Mysql

對於典型的 Web 使用,將 MySQL 隔離設置為“未送出讀取”(臟讀)是否安全?即使複製?

  • February 28, 2011

我正在一個具有典型 CRUD 網路使用模式的網站上工作:類似於使用者創建/更新內容和其他使用者閱讀內容的部落格或論壇。

在這種情況下,似乎可以將數據庫的隔離級別設置為“未送出讀”(臟讀)。我對“讀取未送出”的一般缺點的理解是,讀者可能會讀取稍後將回滾的未送出數據。

在 CRUD 部落格/論壇使用模式中,是否會有任何回滾?即使有,讀取未送出的數據是否有任何重大問題?

現在我沒有使用任何複製,但是將來如果我想使用複制(基於行,而不是基於語句),“讀取未送出”隔離級別會阻止我這樣做嗎?

你怎麼看?有沒有人嘗試在他們的 RDBMS 上使用“讀取未送出”?

您可以安全地使用基於行的複制,但不能使用基於語句的複制。

READ UNCOMMITTED 的問題不在於可能存在回滾 - 至少,這不是主要問題。主要問題是您可能會獲得部分數據。例如,使用部落格,假設您有一個匯總表,其中包含已存在的文章數量。您還有一個表格,每個文章都有一行。顯然我在這裡編造東西——這不是你應該擁有的結構。

無論如何,在一個執行緒中,您啟動一個事務,將匯總表中的文章數從 4 更新為 5,插入一個新的文章行,然後送出該事務。完美執行。

在另一個執行緒中,您閱讀文章的數量並將部落格顯示到單個螢幕上。這個查詢(一個非常快的查詢)發生在 UPDATE 和 INSERT 語句之間。文章數顯示為“5”,如果幸運的話,您有 4 篇博文。如果您的編碼不走運,並且實際上使用了摘要編號而不是僅僅顯示它,那麼您就會遇到數組溢出情況……

在大多數情況下,READ COMMITTED 是您想要提供適當一致性的內容。

引用自:https://serverfault.com/questions/100664