spring事務隔離級別以及臟讀 不可重復讀 幻影讀


隔離級別

聲明式事務的第二個方面是隔離級別。隔離級別定義一個事務可能受其他並發事務活動活動影響的程度。另一種考慮一個事務的隔離級別的方式,是把它想象為那個事務對於事物處理數據的自私程度。

在一個典型的應用程序中,多個事務同時運行,經常會為了完成他們的工作而操作同一個數據。並發雖然是必需的,但是會導致一下問題:

  • 臟讀(Dirty read)-- 臟讀發生在一個事務讀取了被另一個事務改寫但尚未提交的數據時。如果這些改變在稍后被回滾了,那么第一個事務讀取的數據就會是無效的。
  • 不可重復讀(Nonrepeatable read)-- 不可重復讀發生在一個事務執行相同的查詢兩次或兩次以上,但每次查詢結果都不相同時。這通常是由於另一個並發事務在兩次查詢之間更新了數據。
  • 幻影讀(Phantom reads)-- 幻影讀和不可重復讀相似。當一個事務(T1)讀取幾行記錄后,另一個並發事務(T2)插入了一些記錄時,幻影讀就發生了。在后來的查詢中,第一個事務(T1)就會發現一些原來沒有的額外記錄。

在理想狀態下,事務之間將完全隔離,從而可以防止這些問題發生。然而,完全隔離會影響性能,因為隔離經常牽扯到鎖定在數據庫中的記錄(而且有時是鎖定完整的數據表)。侵占性的鎖定會阻礙並發,要求事務相互等待來完成工作。

考慮到完全隔離會影響性能,而且並不是所有應用程序都要求完全隔離,所以有時可以在事務隔離方面靈活處理。因此,就會有好幾個隔離級別。

隔離級別 含義
ISOLATION_DEFAULT 使用后端數據庫默認的隔離級別。
ISOLATION_READ_UNCOMMITTED 允許讀取尚未提交的更改。可能導致臟讀、幻影讀或不可重復讀。
ISOLATION_READ_COMMITTED 允許從已經提交的並發事務讀取。可防止臟讀,但幻影讀和不可重復讀仍可能會發生。
ISOLATION_REPEATABLE_READ 對相同字段的多次讀取的結果是一致的,除非數據被當前事務本身改變。可防止臟讀和不可重復讀,但幻影讀仍可能發生。
ISOLATION_SERIALIZABLE 完全服從ACID的隔離級別,確保不發生臟讀、不可重復讀和幻影讀。這在所有隔離級別中也是最慢的,因為它通常是通過完全鎖定當前事務所涉及的數據表來完成的。

只讀

聲明式事務的第三個特性是它是否是一個只讀事務。如果一個事務只對后端數據庫執行讀操作,那么該數據庫就可能利用那個事務的只讀特性,采取某些優化 措施。通過把一個事務聲明為只讀,可以給后端數據庫一個機會來應用那些它認為合適的優化措施。由於只讀的優化措施是在一個事務啟動時由后端數據庫實施的, 因此,只有對於那些具有可能啟動一個新事務的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED)的方法來說,將事務聲明為只讀才有意義。

此外,如果使用Hibernate作為持久化機制,那么把一個事務聲明為只讀,將使Hibernate的flush模式被設置為FLUSH_NEVER。這就告訴Hibernate避免和數據庫進行不必要的對象同步,從而把所有更新延遲到事務的結束。

事務超時

為了使一個應用程序很好地執行,它的事務不能運行太長時間。因此,聲明式事務的下一個特性就是它的超時。

假設事務的運行時間變得格外的長,由於事務可能涉及對后端數據庫的鎖定,所以長時間運行的事務會不必要地占用數據庫資源。這時就可以聲明一個事務在特定秒數后自動回滾,不必等它自己結束。

由於超時時鍾在一個事務啟動的時候開始的,因此,只有對於那些具有可能啟動一個新事務的傳播行為(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED)的方法來說,聲明事務超時才有意義。

回滾規則

事務五邊形的對后一個邊是一組規則,它們定義哪些異常引起回滾,哪些不引起。在默認設置下,事務只在出現運行時異常(runtime exception)時回滾,而在出現受檢查異常(checked exception)時不回滾(這一行為和EJB中的回滾行為是一致的)。

不過,也可以聲明在出現特定受檢查異常時像運行時異常一樣回滾。同樣,也可以聲明一個事務在出現特定的異常時不回滾,即使那些異常是運行時一場。

 

 

五個事務隔級別分別為:lsolation的屬性值

1,default

默認的事務隔離級別

2,read_uncommitted

讀未提交,一個事務可以操作另外一個未提交的事務,不能避免臟讀,不可重復讀,幻讀,隔離級別最低,並發性 能最高

3,read_committed

讀已提交,一個事務不可以操作另外一個未提交的事務, 能防止臟讀,不能避免不可重復讀,幻讀。

4,repeatable_read

能夠避免臟讀,不可重復讀,不能避免幻讀

5,serializable

隔離級別最高,消耗資源最低,代價最高,能夠防止臟讀, 不可重復讀,幻讀。


七個事務的傳播行為

1,propagation_required

如果一個事務存在,則支持當前事務,如果不存在,則創建新的事務

2,propagation_supports

如果一個事務存在,則支持當前事務,如果不存在,則非事務的方法運行

3,propagation_mendatory

如果一個事務存在,則支持當前事務,如果存在,則拋出異常

4,propagation_requires_new

總是要開啟一個新的事務,如果事務存在,將該事務掛起

5,propagation_not_supported

總是非事務方法運行,並掛起所有的事務

6,propagation_never

總是非事務方法運行,如果事務存在則拋出異常

7,propagation_nested

某一個事務存在,則運行在一個嵌套的事務中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM