網絡營銷計劃的七個步驟鄭州seo實戰(zhàn)培訓
📫作者簡介:小明java問道之路,2022年度博客之星全國TOP3,專注于后端、中間件、計算機底層、架構設計演進與穩(wěn)定性建設優(yōu)化,文章內容兼具廣度、深度、大廠技術方案,對待技術喜歡推理加驗證,就職于知名金融公司后端高級工程師。
? ? ? ??
📫 熱衷分享,喜歡原創(chuàng)~ 關注我會給你帶來一些不一樣的認知和成長。
? ? ? ??
🏆 2022博客之星TOP3 | CSDN博客專家 | 后端領域優(yōu)質創(chuàng)作者 | CSDN內容合伙人
🏆 InfoQ(極客邦)簽約作者、阿里云專家 | 簽約博主、51CTO專家 | TOP紅人、華為云享專家
????????
🔥如果此文還不錯的話,還請👍關注、點贊、收藏三連支持👍一下博主~?
🍅 文末獲取聯(lián)系 🍅??👇🏻 精彩專欄推薦訂閱收藏 👇🏻
專欄系列(點擊解鎖)
學習路線(點擊解鎖)
知識定位
🔥Redis從入門到精通與實戰(zhàn)🔥
Redis從入門到精通與實戰(zhàn)
圍繞原理源碼講解Redis面試知識點與實戰(zhàn)
🔥MySQL從入門到精通🔥
MySQL從入門到精通
全面講解MySQL知識與企業(yè)級MySQL實戰(zhàn) 🔥計算機底層原理🔥
深入理解計算機系統(tǒng)CSAPP
以深入理解計算機系統(tǒng)為基石,構件計算機體系和計算機思維
Linux內核源碼解析
圍繞Linux內核講解計算機底層原理與并發(fā)
🔥數據結構與企業(yè)題庫精講🔥
數據結構與企業(yè)題庫精講
結合工作經驗深入淺出,適合各層次,筆試面試算法題精講
🔥互聯(lián)網架構分析與實戰(zhàn)🔥
企業(yè)系統(tǒng)架構分析實踐與落地
行業(yè)最前沿視角,專注于技術架構升級路線、架構實踐
互聯(lián)網企業(yè)防資損實踐
互聯(lián)網金融公司的防資損方法論、代碼與實踐
🔥Java全棧白寶書🔥
精通Java8與函數式編程
本專欄以實戰(zhàn)為基礎,逐步深入Java8以及未來的編程模式
深入理解JVM
詳細介紹內存區(qū)域、字節(jié)碼、方法底層,類加載和GC等知識
深入理解高并發(fā)編程
深入Liunx內核、匯編、C++全方位理解并發(fā)編程
Spring源碼分析
Spring核心七IOC/AOP等源碼分析
MyBatis源碼分析
MyBatis核心源碼分析
Java核心技術
只講Java核心技術
本文目錄
本文導讀
一、什么是Spring 事務?
二、Spring 的事務隔離級別?
三、Spring事務分類
四、Spring 事務原理
1、@Transactional?工作機制
2、Spring 事務原理詳解
五、Spring 的事務傳播機制
總結
本文導讀
本文主要解讀什么是Spring事務?Spring事務隔離級別?Spring編程式事務TransactionTemplate以及@Transactional原理,最后講解Spring??碱}事務傳播機制。
一、什么是Spring 事務?
Spring 事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,Spring 是無法提供事務功能的。
Spring 只提供統(tǒng)一事務管理接口,具體實現都是由各數據庫自己實現,數據庫事務的提交和回滾是通過數據庫自己的事務機制實現。
二、Spring 的事務隔離級別?
Spring的接口TransactionDefinition中定義了表示隔離級別的常量,當然其實主要還是對應數據庫的事務隔離級別:
isolation_default:使用后端數據庫默認的隔離界別,mysql 默認可重復讀
isolation_read_uncommitted:讀未提交
isolation_read_committed:讀已提交
isolation_repeatable_read:可重復讀
isolation_serializable:串行化
三、Spring事務分類
編程式事務:編程式事務管理使用 TransactionTemplate,需要顯式執(zhí)行事務。
聲明式事務:聲明式事務管理建立在 AOP 之上的。其本質是通過 AOP 功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前啟動一個事務,在執(zhí)行完目標方法之后根據執(zhí)行情況提交或者回滾事務。優(yōu)點是不需要在業(yè)務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規(guī)則聲明或通過 @Transactional 注解的方式,便可以將事務規(guī)則應用到業(yè)務邏輯中,減少業(yè)務代碼的污染。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。
四、Spring 事務原理
1、@Transactional?工作機制
Transactional 的工作機制是基于 AOP 實現的。如果一個類或者一個類中的 public 方法上被標注@Transactional 注解的話,Spring 容器就會在啟動的時候為其創(chuàng)建一個代理類。
在調用被@Transactional 注解的 public 方法的時候,實際調用的是,TransactionInterceptor 類中的 invoke()方法。這個方法的作用就是在目標方法之前開啟事務,方法執(zhí)行過程中如果遇到異常的時候回滾事務,方法調用完成之后提交事務。
2、Spring 事務原理詳解
在Bean初始化階段創(chuàng)建代理對象:Spring容器在初始化每個單例bean的時候,會遍歷容器中的所有BeanPostProcessor實現類,并執(zhí)行其postProcessAfterInitialization方法,在執(zhí)行AbstractAutoProxyCreator類的postProcessAfterInitialization方法時會遍歷容器中所有的切面,查找與當前實例化bean匹配的切面,這里會獲取事務屬性切面,查找@Transactional注解及其屬性值,然后根據得到的切面創(chuàng)建一個代理對象,默認是使用JDK動態(tài)代理創(chuàng)建代理,如果目標類是接口,則使用JDK動態(tài)代理,否則使用Cglib。
在執(zhí)行目標方法時進行事務增強操作:當通過代理對象調用Bean方法的時候,會觸發(fā)對應的AOP增強攔截器,聲明式事務是一種環(huán)繞增強,對應接口為MethodInterceptor,事務增強對該接口的實現為TransactionInterceptor。
事務攔截器TransactionInterceptor在invoke方法中,通過調用父類 TransactionAspectSupport 的invokeWithinTransaction方法進行事務處理,包括開啟事務、事務提交、異?;貪L。
五、Spring 的事務傳播機制
public enum Propagation { REQUIRED //required:需要事務,如果事務不存在,則創(chuàng)建一個新事務 REQUIRES_NEW //required_new:需要創(chuàng)建一個新事務,如果已存在事務,則把當前事務掛起 NESTED //nested:嵌套事務SUPPORTS //supports:支持事務,如果沒有事務,則以非事務的方式運行 NOT_SUPPORTED //not_supported:不支持事務,以非事務的方式運行,如果存在事務,則掛起 NEVER //never:不支持事務,如果存在事務,則拋出異常 MANDATORY //mandatory:支持事務,如果沒有事務,則拋出異常
}
required:@Transactional注解默認使用就是這個事務傳播行為。如果外部方法沒有開啟事務的話,Propagation.required修飾的內部方法會新開啟自己的事務,且開啟的事務相互獨立,互不干擾。如果外部方法開啟事務并且被Propagation.required的話,所有Propagation.REQUIRED修飾的內部方法和外部方法均屬于同一事務 ,只要一個方法回滾,整個事務均回滾。
requires_new:創(chuàng)建一個新的事務,不管外部方法是否開啟事務,Propagation.requires_new修飾的內部方法會新開啟自己的事務,且開啟的事務相互獨立,互不干擾。
nested:嵌套事務,子事務執(zhí)行完,不會立即提交,而是等待外層事務完成后一起提交。
supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
not_supported:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
never:以非事務方式運行,如果當前存在事務,則拋出異常。
mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。(mandatory:強制性)
總結
本文主要解讀什么是Spring事務?Spring事務隔離級別?Spring編程式事務TransactionTemplate以及@Transactional原理,最后講解Spring??碱}事務傳播機制。