2012-09-18 41 views
3

我瞭解在isolation levels的維基百科頁面上爲「髒讀」和「幻讀」提供的示例。不過,我不確定如何對以下情況進行分類,以及爲避免這種情況應採用什麼隔離級別或不同的策略。在多次插入事務中讀髒或幻讀?

  1. 交易1:插入行表A
  2. 事務2:選擇在表A行
  3. 事務2:選擇在基於先前的一些B錶行讀取
  4. 事務2:提交
  5. 事務1:插入在表B中的行
  6. 事務1:提交

問題是在T1完成寫入兩個表之前,事務2選擇B中的某些內容。步驟3中的選擇可能需要選擇5中插入的行是正確的。這是一個骯髒的閱讀,幻讀或兩者都不。 READ_COMMITTED隔離級別是否足以避免問題?據我瞭解,用READ_COMMITTED T2不應讀取T1在該點插入的新行。

+0

你在步驟4中提交了什麼 - 我沒有看到事務2修改任何數據? – Kaivosukeltaja

+0

@Kaivosukeltaja既然它只是SELECTS在T2上沒有實際的提交。我只是添加它來顯示該交易沒有更多的操作。我會編輯這個問題以使其更加清晰。 –

回答

1

這是一個髒讀。在READ_COMMITTED隔離級別中,步驟2中的查詢將不會返回您在步驟1中插入但尚未提交的行,從而防止未成功嘗試訪問尚未插入的數據。

一個幻象就意味着你兩次執行相同查詢內幕交易2和得到一個不同的結果集。

+0

只是爲了確保:只有T2應該有隔離級別READ_COMMITTED? T1的隔離級別是否相關?在某些地方,文檔中提到_「這個級別禁止一個事務讀取一行中未修改的變化」,這表明讀取事務應該有READ_COMMITTED,而在其他地方文檔說的是「在這個隔離級別中,DBMS實現保持寫鎖「,這表明寫事務應該是READ_COMMITTED。 –

+0

@CristianVrabie:應該爲T2指定READ_COMMITTED,因爲它會影響讀取時的鎖定行爲。請參閱此鏈接以獲取示例:http://www.herongyang.com/MySQL/Transaction-Isolation-Level-Read-Uncommitted.html 另請注意,InnoDB中的默認事務隔離級別是REPEATABLE READ,它甚至更多隔離比READ COMMITTED。 – Kaivosukeltaja