網站首頁 編程語言 正文
一、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
相關推薦
- 2022-05-13 檢測到調試后執行的代碼
- 2022-11-04 C#使用BinaryFormatter類、ISerializable接口、XmlSerializer
- 2023-07-31 Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElemen
- 2022-09-23 Shell腳本函數傳遞參數的實現方法_linux shell
- 2022-08-05 C語言示例講解if?else語句的用法_C 語言
- 2022-12-24 darknet框架中YOLOv3對數據集進行訓練和預測詳解_python
- 2023-05-13 python中數字列表轉化為數字字符串的實例代碼_python
- 2022-10-10 React路由組件三種傳參方式分析講解_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支