SpringBoot 事務隔離性和傳播性


propergation 傳播性

Spring中七種Propagation類的事務屬性詳解:

  • REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  • SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
  • MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常。
  • REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。
  • NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
  • NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
  • NESTED:支持當前事務,如果當前事務存在,則執行一個嵌套事務,如果當前沒有事務,就新建一個事務。 

isolation 隔離性

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

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

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

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

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

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


免責聲明!

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



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