1. 程式人生 > >Oracle學習筆記20150901髒讀不可重複讀以及幻讀概念理解

Oracle學習筆記20150901髒讀不可重複讀以及幻讀概念理解

1.髒讀幻讀不可重複讀概念

髒讀:(關鍵點在於事務T2讀取到了T1沒有持久化的修改的資料)又稱無效資料的讀出,是指在資料庫訪問中,事務T1將某一值修改,然後事務T2讀取該值,此後T1因為某種原因撤銷對該值的修改,這就導致了T2所讀取到的資料是無效的(Oracle中不支援髒讀,如果T1未提交資料則T2無法查詢到T1所修改但是未提交的資料.)

不可重複讀:(關鍵點在於事務T1進行多次讀取同一行資料返回的結果集由於事務T2的操作而不同,如果T2的操作沒有持久化那麼這種情況也同時屬於髒讀)即原始讀取不可重複 .是指在資料庫訪問中,一個事務範圍內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改的提交而引起的。比如事務T1讀取某一資料,事務T2讀取並修改了該資料,T1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

幻讀(虛讀) phantom   read:如果符合搜尋條件的一行資料在後面的讀取操作中出現,但該行資料卻不屬於最初的資料,就會發生這種事件。舉例來說:Transaction   1   讀取滿足某種搜尋條件的一些行,然後   Transaction   2   插入了符合   Transaction   1   的搜尋條件的一個新行。如果   Transaction   1   重新執行產生原來那些行的查詢,就會得到不同的行。

摘錄自其他人的部落格:

1.這裡是另一個csdn大神非常清晰的總結,這裡摘錄一部分,完整版連結:這裡是連結

髒讀 dirty   reads:當事務讀取還未被提交的資料時,就會發生這種事件。舉例來說:Transaction   1   修改了一行資料,然後   Transaction   2   在   Transaction   1   還未提交修改操作之前讀取了被修改的行。如果   Transaction   1   回滾了修改操作,那麼   Transaction   2   讀取的資料就可以看作是從未存在過的。     


不可重複的讀 non-repeatable   reads:當事務兩次讀取同一行資料,但每次得到的資料都不一樣時,就會發生這種事件。舉例來說:Transaction   1   讀取一行資料,然後   Transaction   2   修改或刪除該行並提交修改操作。當   Transaction   1   試圖重新讀取該行時,它就會得到不同的資料值(如果該行被更新)或發現該行不再存在(如果該行被刪除)。     
虛讀 phantom   read:如果符合搜尋條件的一行資料在後面的讀取操作中出現,但該行資料卻不屬於最初的資料,就會發生這種事件。舉例來說:Transaction   1   讀取滿足某種搜尋條件的一些行,然後   Transaction   2   插入了符合   Transaction   1   的搜尋條件的一個新行。如果   Transaction   1   重新執行產生原來那些行的查詢,就會得到不同的行。

2.這裡是轉載自另一個大神09年05月的總結連結為這裡是連結

1, 髒讀

一個事務讀到另一個事務,尚未提交的修改,就是髒讀。這裡所謂的修改,除了Update操作,不要忘了,還包括
Insert和Delete操作。

髒讀的後果:如果後一個事務回滾,那麼它所做的修改,統統都會被撤銷。前一個事務讀到的資料,就是垃圾資料。


舉個例子:預訂房間。
有一張Reservation表,往表中插入一條記錄,來訂購一個房間。

 事務1:在Reservation表中插入一條記錄,用於預訂99號房間。

 事務2:查詢,尚未預定的房間列表,因為99號房間,已經被事務1預訂。所以不在列表中。

 事務1:信用卡付款。由於付款失敗,導致整個事務回滾。
        所以插入到Reservation 表中的記錄並不置為持久(即它將被刪除)。

現在99號房間則為可用。
所以,事務2所用的是一個無效的房間列表,因為99號房間,已經可用。如果它是最後一個沒有被預定的房間,那麼這將是一個嚴重的失誤。

注:髒讀的後果很嚴重。

2,不可重複讀。

在同一個事務中,再次讀取資料時【就是你的select操作】,所讀取的資料,和第1次讀取的資料,不一樣了。就是不可重複讀。

舉個例子:
 事務1:查詢有雙人床房間。99號房間,有雙人床。

 事務2:將99號房間,改成單人床房間。

 事務1:再次執行查詢,請求所有雙人床房間列表,99號房間不再列表中了。也就是說,
               事務1,可以看到其他事務所做的修改。


在不可重複讀,裡面,可以看到其他事務所做的修改,而導致2次的查詢結果不再一樣了。
這裡的修改,是提交過的。也可以是沒有提交的,這種情況同時也是髒讀。

如果,資料庫系統的隔離級別。允許,不可重複讀。那麼你啟動一個事務,並做一個select查詢操作。
查詢到的資料,就有可能,和你第2次,3次...n次,查詢到的資料不一樣。一般情況下,你只會做一次,select
查詢,並以這一次的查詢資料,作為後續計算的基礎。因為允許出現,不可重複讀。那麼任何
時候,查詢到的資料,都有可能被其他事務更新,查詢的結果將是不確定的。


注:如果允許,不可重複讀,你的查詢結果,將是不確定的。一個不確定的結果,你能容忍嗎?


3,幻讀

事務1讀取指定的where子句所返回的一些行。然後,事務2插入一個新行,這個新行也滿足事務1使用的查詢
where子句。然後事務1再次使用相同的查詢讀取行,但是現在它看到了事務2剛插入的行。這個行被稱為幻象,
因為對事務1來說,這一行的出現是不可思議的。

舉個例子:
事務1:請求沒有預定的,雙人床房間列表。
事務2:向Reservation表中插入一個新紀錄,以預訂99號房間,並提交。
事務1:再次請求有雙人床的未預定的房間列表,99號房間,不再位於列表中。


注:幻讀,針對的是,Insert操作。如果事務2,插入的記錄,沒有提交。那麼同時也是髒讀。