2013-08-18 25 views
13

this預言Java教程:差Vs髒讀

當事務A檢索一排, 事務B隨後更新該行,和事務A以後 時,會發生非重複讀再次檢索同一行。事務A檢索同一行 兩次,但看到不同的數據。

髒讀和不可重複讀之間有什麼區別?這不是一回事嗎?由於他人更新而讀錯了結果?

在此先感謝。

回答

14

完全相同的頁解釋了髒讀就是:

訪問尚未提交被認爲是一個髒讀,因爲它有可能被回滾到以前的值值的更新值。如果讀取的值稍後回滾,則您將讀取無效值。

因此,不可重複讀取包括讀取兩個不同的提交值,而髒讀包括讀取尚未提交的值。很不一樣。

+0

雖然怎麼可能?我的意思是在事務完成之後,防止不可重複讀取的唯一方法是在提交之後保持鎖定......無論如何遲早會完成另一個連接(B),以及如何防止更新以前由A – Rollerball

+0

檢索的行或者每次只有1個連接可能寫入DBMS。所以只要有一個到DBMS的活動連接,沒有其他連接可以實際更新這些特定行的數據庫(直到第一個連接關閉)我是對的嗎? – Rollerball

+1

只有在事務持續時間內才能保證可重複讀取:您啓動事務T1,讀取A1,然後另一個事務T2將A1修改爲A2並進行提交,然後第一個事務T1重新讀取該值,並仍然讀取A1 。這是一個可重複的閱讀。當然,T2提交後第一次讀取該值的另一​​個事務T3將讀取提交的值A2。要知道數據庫如何實現它,請閱讀其文檔。他們大多使用[MVCC](http://en.wikipedia.org/wiki/Multiversion_concurrency_control),AFAIK。 –

11

here: -

髒讀一個事務讀取由另一個寫入的數據, 未提交,交易發生。骯髒讀取的危險是其他事務可能永遠不會提交,使原始事務 中的「髒」數據。

非重複讀取,當一個事務試圖兩次訪問 相同的數據和第二事務修改之間的 第一個事務的讀取嘗試數據發生。這可能會導致第一個事務爲相同的數據讀取兩個不同的值,導致原始讀取不可重複。

+0

雖然怎麼可能?我的意思是在事務完成之後,防止不可重複讀取的唯一方法是在提交之後保持鎖定...無論如何遲早會有另一個連接(B)完成,以及如何防止先前由A – Rollerball

+0

檢索到的那一行的更新或者每次只有一個連接可能寫入DBMS中。所以只要有一個到DBMS的活動連接,沒有其他連接可以實際更新這些特定行的數據庫(直到第一個連接關閉)我是對的嗎? – Rollerball

+0

不可重複讀取是一個事務不能再次讀取的地方,除非另一個事務改變該行。在執行select語句時,當未獲取讀取鎖時,發生不可重複讀取。在需要通過提交衝突實現的事務時可能發生不可重複的讀取,必須放寬回滾。 –