日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Spring的隔離級別&事務傳播屬性&數據庫隔離級別之間的聯系

作者:洋洋洋coding 更新時間: 2022-07-16 編程語言
一、Spring五大事務隔離級別
Spring事務隔離級別比數據庫事務隔離級別多一個default
在進行配置的時候,如果數據庫和spring代碼中的隔離級別不同,那么以spring的配置為主。


1) DEFAULT (默認)
這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。另外四個與MySQL的隔離級別相對應。

2) READ_UNCOMMITTED (讀未提交)
這是事務最低的隔離級別,它允許另外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀。

3) READ_COMMITTED (讀已提交)
保證一個事務修改的數據提交后才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,
但是可能會出現不可重復讀和幻讀。

4) REPEATABLE_READ (可重復讀)
這種事務隔離級別可以防止臟讀、不可重復讀,但是可能出現幻讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,
還保證了不可重復讀。

5) SERIALIZABLE(串行化)
這是花費最高代價但是最可靠的事務隔離級別,事務被處理為順序執行。除了防止臟讀、不可重復讀外,還避免了幻讀。

隔離級別越高,越能保證數據的完整性和一致性,但是對并發性能的影響也越大。對于多數應用程序,可以優先考慮把數據庫系統的
隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的并發性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新
這些并發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。

二、Spring七大事務傳播屬性
1) required(默認屬性)
如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。
被設置成這個級別時,會為每一個被調用的方法創建一個邏輯事務域。如果前面的方法已經創建了事務,那么后面的方法支持當前的事務,
如果當前沒有事務會重新建立事務。

2) Mandatory
支持當前事務,如果當前沒有事務,就拋出異常。

3) Never
以非事務方式執行,如果當前存在事務,則拋出異常。

4) Not_supports
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

5) requires_new
新建事務,如果當前存在事務,把當前事務掛起。

6) Supports
支持當前事務,如果當前沒有事務,就以非事務方式執行。

7) Nested
支持當前事務,新增Savepoint點,與當前事務同步提交或回滾。
嵌套事務一個非常重要的概念就是內層事務依賴于外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗并不會引起外層事務的回滾。

三、Spring隔離級別與數據庫隔離級別聯系
spring事務本質上使用數據庫事務,而數據庫事務本質上使用數據庫鎖,所以spring事務本質上使用數據庫鎖,開啟spring事務意味著使用數據庫鎖;

事務的隔離級別是通過鎖的機制實現的,事務的隔離級別是數據庫開發商根據業務邏輯的實際需要定義的一組鎖的使用策略。
當我們將數據庫的隔離級別定義為某一級別后如仍不能滿足要求,我們可以自定義 sql 的鎖來覆蓋事務隔離級別默認的鎖機制。

spring事務實際使用AOP攔截注解方法,然后使用動態代理處理事務方法,捕獲處理過程中的異常,spring事務其實是把異常交給spring處理;

spring事務只有捕獲到異常才會終止或回滾,如果你在程序中try/catch后自己處理異常而沒有throw,那么事務將不會終止或回滾,
失去事務本來的作用;

spring事務會捕獲所有的異常,但只會回滾數據庫相關的操作,并且只有在聲明了rollbackForClassName="Exception"之類的配置才會回滾。

spring事務會回滾同一事務中的所有數據庫操作,本質上是回滾同一數據庫連接上的數據庫操作。

原文鏈接:https://blog.csdn.net/weixin_56311692/article/details/125774279

欄目分類
最近更新