Spring 的事務隔離級別和傳播特性

今天被人問了一個Oracle 關於事務的簡單問題,結果本身一時間居然說錯了  死了死了的,只能說本身沒有用心去理解這個問題。 html

找了一下別人的解釋貼這裏更直觀 java

------------------------------------------------------------------------------------------------------------------------------------ 數據庫


1, 髒讀 spa

一個事務讀到另外一個事務,還沒有提交的修改,就是髒讀。這裏所謂的修改,除了Update操做,不要忘了,還包括
Insert和Delete操做。 .net

髒讀的後果:若是後一個事務回滾,那麼它所作的修改,通通都會被撤銷。前一個事務讀到的數據,就是垃圾數據。 htm


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

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

 事務2:查詢,還沒有預約的房間列表,由於99號房間,已經被事務1預訂。因此不在列表中。 事務

 事務1:信用卡付款。因爲付款失敗,致使整個事務回滾。
        因此插入到Reservation 表中的記錄並不置爲持久(即它將被刪除)。 get

如今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,插入的記錄,沒有提交。那麼同時也是髒讀。

--------------------------------- --------------------------------- --------------------------------- --------------------------------- ---------------------------------


Spring在TransactionDefinition接口中定義這些屬性

在TransactionDefinition接口中定義了五個不一樣的事務隔離級別

ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應 

ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務能夠看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀

ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另一個事務讀取。另一個事務不能讀取該事務未提交的數據。這種事務隔離級別能夠避免髒讀出現,可是可能會出現不可重複讀和幻像讀。

ISOLATION_REPEATABLE_READ 這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的狀況產生(不可重複讀)。

ISOLATION_SERIALIZABLE 這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。

 

在TransactionDefinition接口中定義了七個事務傳播行爲。

PROPAGATION_REQUIRED 若是存在一個事務,則支持當前事務。若是沒有事務則開啓一個新的事務。

PROPAGATION_SUPPORTS 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行。可是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少量不一樣。

PROPAGATION_MANDATORY 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常。

PROPAGATION_REQUIRES_NEW 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。

PROPAGATION_NOT_SUPPORTED 老是非事務地執行,並掛起任何存在的事務。

PROPAGATION_NEVER 老是非事務地執行,若是存在一個活動事務,則拋出異常

PROPAGATION_NESTED若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

資料連接

http://blog.csdn.net/xifeijian/article/details/20313977

相關文章
相關標籤/搜索