Mysql

可重複閱讀:哪一個是正確的?

  • October 12, 2019

哪一個是正確的?

  1. 使用事務 1作為可重複讀取,其他事務在被**事務 1選擇後不能更新行。
  2. 使用事務 1作為可重複讀取,其他事務可以更新一行,但事務 1不考慮這些更改。

我以前相信(1)是對的。但是當我在機器上測試樣本交易時,(2)是正確的。我正在使用 MySQL 版本 5.1.2.re 社區。

雖然許多數據庫系統實際上會像您的第一個版本一樣執行,但對於 MySQL,版本 2 是預期的行為,請參閱有關可重複讀取的文件:

這是 InnoDB 的預設隔離級別。同一事務中的一致性讀取讀取第一次讀取建立的快照。這意味著,如果您在同一事務中發出多個普通(非鎖定)SELECT 語句,這些 SELECT 語句也相互一致。

這意味著:如果您select在同一行,則(從快照中)獲得相同的數據,即使該行已被另一個事務刪除。這就是sql標準所要求的:它必須防止“不可重複讀取”(除了較低隔離級別的“臟讀”),但是每個數據庫系統可以在細節上有所不同。

在 MySQL 中,如果您想阻止另一個事務更新 中的行repeatable read,您需要通過例如使用來鎖定它們select ... for update。除非您處於隔離模式,否則簡單select不會放置鎖。serializable

如果數據庫使用Multiversion並發控制,那麼2.是正確的。但是,如果它使用兩相鎖定,那麼 1. 是正確的。

引用自:https://dba.stackexchange.com/questions/165259