REQUIRED(默認):支持使用當前事務,如果當前事務不存在,創建一個新事務。
SUPPORTS:支持使用當前事務,如果當前事務不存在,則不使用事務。
MANDATORY:中文翻譯為強制,支持使用當前事務,如果當前事務不存在,則拋出Exception。
REQUIRES_NEW:創建一個新事務,如果當前事務存在,把當前事務掛起。
NOT_SUPPORTED:無事務執行,如果當前事務存在,把當前事務掛起。
NEVER:無事務執行,如果當前有事務則拋出Exception。
NESTED:嵌套事務,如果當前事務存在,那么在嵌套的事務中執行。如果當前事務不存在,則表現跟REQUIRED一樣。
格式:@Transactional(propagation = Propagation.REQUIRES_NEW)
首先介紹
1. 臟讀 :臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。
2. 不可重復讀 :是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那么,在第一個事務中的兩 次讀數據之間,由於第二個事務的修改,那么第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不 可重復讀。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復。如果 只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。
…數據庫事務和Spring事務是一般面試都會被提到,很多朋友寫慣了代碼,很少花時間去整理歸納這些東西,結果本來會的東西,居然吞吞吐吐答不上來。
下面是我收集到一些關於Spring事務的問題,希望能幫助大家過關。
3. 幻讀 : 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。 同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象 發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合並到該文檔的主復本時,發現作者已將未編輯的新材料添加到該文檔中。 如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題
事務的4種隔離級別
原文鏈接:https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189
ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀
ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。
ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀外,還避免了幻讀。
那么什么是嵌套事務呢?很多人都不理解,我看過一些博客,都是有些理解偏差。
嵌套是子事務套在父事務中執行,子事務是父事務的一部分,在進入子事務之前,父事務建立一個回滾點,叫save point,然后執行子事務,這個子事務的執行也算是父事務的一部分,然后子事務執行結束,父事務繼續執行。重點就在於那個save point。看幾個問題就明了了:
如果子事務回滾,會發生什么?
父事務會回滾到進入子事務前建立的save point,然后嘗試其他的事務或者其他的業務邏輯,父事務之前的操作不會受到影響,更不會自動回滾。
如果父事務回滾,會發生什么?
父事務回滾,子事務也會跟着回滾!為什么呢,因為父事務結束之前,子事務是不會提交的,我們說子事務是父事務的一部分,正是這個道理。那么:
事務的提交,是什么情況?
是父事務先提交,然后子事務提交,還是子事務先提交,父事務再提交?答案是第二種情況,還是那句話,子事務是父事務的一部分,由父事務統一提交。
現在你再體會一下這個”嵌套“,是不是有那么點意思?
以上是事務的7個傳播級別,在日常應用中,通常可以滿足各種業務需求,但是除了傳播級別,在讀取數據庫的過程中,如果兩個事務並發執行,那么彼此之間的數據是如何影響的呢?
這就需要了解一下事務的另一個特性:數據隔離級別
數據隔離級別分為不同的四種:
1、Serializable :最嚴格的級別,事務串行執行,資源消耗最大;
2、REPEATABLE READ :保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。
3、READ COMMITTED :大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個並行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用於大多數系統。
4、Read Uncommitted :保證了讀取過程中不會讀取到非法數據。
上面的解釋其實每個定義都有一些拗口,其中涉及到幾個術語:臟讀、不可重復讀、幻讀。
這里解釋一下:
臟讀 :所謂的臟讀,其實就是讀到了別的事務回滾前的臟數據。比如事務B執行過程中修改了數據X,在未提交前,事務A讀取了X,而事務B卻回滾了,這樣事務A就形成了臟讀。
不可重復讀 :不可重復讀字面含義已經很明了了,比如事務A首先讀取了一條數據,然后執行邏輯的時候,事務B將這條數據改變了,然后事務A再次讀取的時候,發現數據不匹配了,就是所謂的不可重復讀了。
幻讀 :小的時候數手指,第一次數十10個,第二次數是11個,怎么回事?產生幻覺了?
幻讀也是這樣子,事務A首先根據條件索引得到10條數據,然后事務B改變了數據庫一條數據,導致也符合事務A當時的搜索條件,這樣事務A再次搜索發現有11條數據了,就產生了幻讀。
事務傳播方式案例:https://blog.csdn.net/m0_37034934/article/details/81903564