Spring的事務管理
事務簡介
- 事務:一系列操作,使資料庫從一個狀態轉換到另一個狀態,且保證要麼全部成功要麼全部失敗。
- 事務滿足 ACID 原則:
- 原子性:不可分割,要麼全部成功,要麼全部失敗
- 一致性:從一個狀態到另一個狀態
- 隔離性:正確提交前,可能到結果不應顯示給其他事務
- 永續性:提交後,永久儲存在資料庫中
Java事務
- 在Java編寫的程式實現ACID操作,把資料庫的增刪改查的事務操作轉移到Java程式碼中控制。
- Java事務機制和原理就是確保資料庫操作的ACID特性。
Java事務實現模式
- Java事務型別
- JDBC事務:侷限在一個資料庫連線內。
- JTA(Java Transaction API)事務:與實現無關的,與協議無關的API。可跨多個資料庫或多個DAO。
- 容器事務:應用伺服器提供的。
Spring事務核心介面
Spring事務屬性定義
事務屬性
- 傳播行為
int getPropagationBehavior()
- 隔離規則
int getIsolationLevel()
- 回滾規則
- 事務超時
int getTimeout()
- 是否只讀?
boolean isReadOnly()
隔離規則
- 髒讀:事務沒提交,被提前讀取。
- 不可重複讀:兩次讀取資料不一致。
- 幻讀:事務不是獨立執行時發生的一種非預期現象。比如第一個事務修改表中資料全部為男的,第二個事務插入了一個女的,第一個事務再次讀取全表發現怎麼還有個女的。
事務隔離級別:定義了一個事務可能受其他併發事務影響的程度。
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED 髒讀,不可重複度,幻讀
- ISOLATION_READ_COMMITTED 避免髒讀,仍然會有不可重複讀,幻讀
- ISOLATION_REPEATABLE_READ 避免髒讀,不可重複讀,任然會有幻讀
- ISOLATION_SERIALIZABLE 全部避免,也是最慢的
事務傳播行為
- 當事務方法被另一個事務方法呼叫時,必須指定事務應該如何傳播;
- spring的7種傳播行為:
- PROPAGATION_RREQUIRED 當前方法必須執行在事務中。如果不存在事務,則新啟動一個事務
- PROPAGATION_RSUPPORTS 當前方法不需要事務上下文。如果存在事務則在事務中執行
- PROPAGATION_RMANDATORY 當前方法必須執行在事務中。如果不存在事務,則丟擲異常
- PROPAGATION_RREQUIRED_NEW 當前方法必須執行在他自己的事務中,一個新事務會被啟動。如果存在當前事務,在該方法執行期間會被掛起。
- PROPAGATION_RNOT_SUPPORTED 該方法不應該執行在事務中。如果存在事務,在該方法執行期間則被掛起。
- PROPAGATION_RNEVER 當前方法不應該執行在事務上下文。如果當前正有一個事務在執行,則會拋異常
- PROPAGATION_RNESTED 如果當前存在一個事務,則該方法會在巢狀事務中執行。巢狀的事務可以獨立於當前事務進行單獨的提交或回滾。如果當前事務不存在,則和PROPAGATION_REQUIRED一樣。
事務是否只讀
- 利用資料庫事務的“只讀”屬性,進行特定優化處理。
- 設定“只讀”,注意資料庫廠商的支援。Oracle的“readOnly”不起作用,MySQL的“readOnly”影響查詢
事務超時
- 事務超時是一個定時器,在特定時間內完成,否則回滾。
- 設計事務的注意點:事務不能執行太長時間,否則佔用太久資源
事務回滾
- 執行期異常才回滾,而檢查型異常不會回滾
- 自定義回滾策略
- 遇到特定的檢查型異常時像執行期異常一樣回滾。
- 遇到特定的異常不回滾,即使是執行期異常。
事務狀態
- 通過事務管理器獲得TransactionStatus例項
- 控制事務回滾或提交時需要應用對應的事務狀態
程式設計式事務管理概述
- 事務管理器方式 spring事務管理的三個介面
- 步驟:
- 獲取事務管理器;建立事務屬性物件
- 獲取事務狀態物件;建立JDBC模版物件
- 業務資料操作
- 步驟:
- 模版事務的方式(推薦) JdbcTemplate
- 步驟:
- 獲取模版物件
- 選擇事務結果型別
- 業務資料操作處理
- 步驟:
- 總結:
- 需要有效的資料來源
- 建立程式設計事務管理物件
- 業務邏輯
宣告式事務管理
- 基於AOP,對方法前後攔截
- 配置型別:tx攔截器;註解方式
- 實現方式:
- tx攔截器 使用XML配置
- 註解方式
事務管理最佳實踐
- 程式設計式更精確自定義,宣告式更解耦業務
- 小型,業務少,直觀的的用程式設計式
- 大型,事務操作量,複雜的用宣告式
- 事務管理器型別
- 不同資料來源用不同的事務管理器
- 正確選擇PlatformTransactionManager實現類
- 全域性事務的選擇JtaTransactionManager
- 不同資料來源用不同的事務管理器
參考
- Spring事務管理,https://class.imooc.com/course/577
關於我:
linxinzhe,全棧工程師,目前供職於某世界500強銀行的金融科技部門(人工智慧,區塊鏈)。
GitHub:https://github.com/linxinzhe
歡迎留言討論,也歡迎關注我~
我也會關注你的哦!
相關文章
- Spring的事務管理(二)宣告式事務管理Spring
- Spring 事務管理Spring
- Spring 中的事務管理Spring
- Spring系列.事務管理Spring
- Spring系列-事務管理Spring
- (四)Spring中的事務管理Spring
- Spring的事務管理入門:程式設計式事務管理(TransactionTemplate)Spring程式設計
- Spring事務管理總結Spring
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- spring宣告式事務管理配置Spring
- 解析Spring Boot中的事務管理機制Spring Boot
- 分散式鎖和spring事務管理分散式Spring
- Spring事務管理:非常規指南 - marcobehlerSpring
- 使用Spring Boot實現事務管理Spring Boot
- Spring 程式設計式事務管理Spring程式設計
- Spring事務管理(詳解+例項)Spring
- spring事務管理原始碼分析(二)事務處理流程分析Spring原始碼
- Spring AOP 日誌攔截器的事務管理Spring
- Spring中事務管理org.springframework.transactionSpringFramework
- Spring框架中配置事務管理器Spring框架
- spring事務管理原始碼分析(一)配置和事務增強代理的生成流程Spring原始碼
- 可能是最漂亮的Spring事務管理詳解Spring
- spring事務Spring
- Spring 事務Spring
- Spring事務專題(四)Spring中事務的使用、抽象機制及模擬Spring事務實現Spring抽象
- 聊聊spring事務的propagationSpring
- spring事務的傳播Spring
- Spring學習筆記3(JDBC模板&事務管理)Spring筆記JDBC
- spring2 Aop與事務、許可權管理Spring
- 分散式事務之Spring事務與JMS事務(二)分散式Spring
- Spring事務專題(五)聊聊Spring事務到底是如何實現的Spring
- 【Spring】看了這篇Spring事務原理,我才知道我對Spring事務的誤解有多深!Spring
- Spring中的事務提交事件Spring事件
- Spring事務(Transaction)管理高階篇一棧式解決開發中遇到的事務問題Spring
- Spring事務專題(三)事務的基本概念,Mysql事務處理原理SpringMySql
- Spring-AOP事務Spring
- Spring Webflux與事務SpringWebUX
- Spring事務筆記Spring筆記