一文讓你搞懂Spring的統(tǒng)一事務模型-創(chuàng)新互聯(lián)

Spring事務的知識體系

進入主題之前,先來了解一下Spring事務,都有哪些內(nèi)容:

創(chuàng)新互聯(lián)公司是一家專注于做網(wǎng)站、成都做網(wǎng)站與策劃設計,十堰鄖陽網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:十堰鄖陽等地區(qū)。十堰鄖陽做網(wǎng)站價格咨詢:028-86922220

一文讓你搞懂Spring的統(tǒng)一事務模型

Spring事務包含對分布式事務單機事務的支持,我們用的比較多的是單機事務,也就是只操作一個數(shù)據(jù)庫的事務。

單機事務,按照用法分,又可以分為編程式事務模型(TransactionTemplate)和聲明式事務模型(@Transactional注解),后者可以理解為 aop + 編程式事務模型。

編程式事務模型里面涉及到很多知識點,比如統(tǒng)一事務模型、事務傳播級別、事務隔離級別等。

我們今天要講的是其中一點,統(tǒng)一事務模型。

希望這次的分享能夠讓大家,對Spring事務有一個整體性的認識。

不僅僅是Template

Spring的統(tǒng)一事務模型,解決的一個核心問題,就是不管你用的是什么數(shù)據(jù)訪問方式,Hibernate、MyBatis抑或是JDBC,你的Service層的代碼都是一樣的,不需要做任何變動。

使用@Transactional注解的,相信大家都用過,而且由于注解的實現(xiàn)比較隱晦,不利于我們理解原理,這里就不演示。

下面介紹編程式事務模型,TransactionTemplate

一文讓你搞懂Spring的統(tǒng)一事務模型

不管后面你的Dao實現(xiàn)如何變化,上面這一段Service代碼都無需修改,而且依舊可以保持事務的邏輯。

Spring是怎么做到的呢?

有人說,是模板模式

點開TransactionTemplate,的確是封裝了事務操作的“套路”:

一文讓你搞懂Spring的統(tǒng)一事務模型

但是細看就會發(fā)現(xiàn),這和我們傳統(tǒng)的template模式還有點不同。

傳統(tǒng)的template,一般會有一個抽象類,抽象類里封裝了一系列有規(guī)律的套路,然后有些套路是抽象的,需要你自己去實現(xiàn):

一文讓你搞懂Spring的統(tǒng)一事務模型

而TransactionTemplate,它已經(jīng)是一個具體的類,無需實現(xiàn)任何方法,拿來即用。

但仔細看,就會發(fā)現(xiàn)里面有一個叫transactionManager的家伙,出鏡率特別高,它幫TransactionTemplate做了很多事情。

點開一看,這家伙是個叫PlatformTransactionManager的接口:

一文讓你搞懂Spring的統(tǒng)一事務模型

恍然大悟,你只需給TransactionTemplate傳一個PlatformTransactionManager的具體實現(xiàn),也就是告訴TransactionTemplate,事務創(chuàng)建、提交、回滾的具體策略,它就可以按照自己的那套流程,完成事務的操作。

TransactionTemplate,其實是模板+策略的雙劍合璧。

針對不同的廠商,只需要提供不同的PlatformTransactionManager實現(xiàn)即可。

比如對于MyBatis,就用DataSourceTxManager,對于Hibernate,就用HibernateTxManager:

一文讓你搞懂Spring的統(tǒng)一事務模型

不同廠商在實現(xiàn)的時候,按照自己對應的事務操作方式,進行實現(xiàn)即可。

比如DataSourceTxManager,創(chuàng)建事務的時候,new了一個自己的事務對象,最后返回一個Object類型,在commit的時候,再把這個Object,強轉成自己的事務對象:

一文讓你搞懂Spring的統(tǒng)一事務模型

HibernateTxManager也是如此:

一文讓你搞懂Spring的統(tǒng)一事務模型

我們在使用的時候,只需要通過Spring IOC,告訴Spring,要注入哪個TransactionManager,要使用哪種策略即可:

一文讓你搞懂Spring的統(tǒng)一事務模型

connection-pass

了解完Spring是如何實現(xiàn)統(tǒng)一的事務模型,不知道你是否也有疑問:既然是事務,那就要保證事務里的所有dao操作,都要使用同一個數(shù)據(jù)庫連接進行操作,但是我們在寫代碼的時候,并不需要給dao傳入connection對象:

一文讓你搞懂Spring的統(tǒng)一事務模型

Spring又是怎么做到的?

答案是ThreadLocal

通過ThreadLocal,在同一個線程中共享connection。

這很好理解,關鍵是,這是一個什么樣的ThreadLocal?填空題。

一文讓你搞懂Spring的統(tǒng)一事務模型

也許你和我一開始想的一樣,認為這里面放到就是connection對象。

直接放connection對象會有一個問題,那就是當你事務里面,涉及到對多個數(shù)據(jù)庫進行操作時,后面的操作取到的,就都是第一個數(shù)據(jù)庫操作放進去的connection:

一文讓你搞懂Spring的統(tǒng)一事務模型

如上圖,假設deleteAll操作的是db1,那么它創(chuàng)建了針對db1的connection,然后放進ThreadLocal,然后save,本來是想操作db2的,結果它從threadLocal里拿到的,卻是剛剛deleteAll時,放進去的操作db1的connection,卒。

實際上,Spring在ThreadLocal里頭,放的是一個Map。key是dataSource,value才是connection.

一文讓你搞懂Spring的統(tǒng)一事務模型

如何新開一個事務

Spring是支持在事務里面新開一個事務的,最簡單的方式就是使用聲明式事務模型:

一文讓你搞懂Spring的統(tǒng)一事務模型

然而,按照之前的理論,如果每次都是從ThreadLocal里去獲取connection,那么永遠拿到的都是舊的事務,不會創(chuàng)建新事務。

Spring又是如何實現(xiàn)新開事務的呢?

很簡單,鏈表。

一開始,舊事務綁定在當前線程:

一文讓你搞懂Spring的統(tǒng)一事務模型

當需要新開事務時,先將原來的事務解綁:

一文讓你搞懂Spring的統(tǒng)一事務模型

然后new一個新的事務:

一文讓你搞懂Spring的統(tǒng)一事務模型

接著將新的事務指向舊事務:

一文讓你搞懂Spring的統(tǒng)一事務模型

最后將新事務綁定到當前線程:

一文讓你搞懂Spring的統(tǒng)一事務模型

之所以需要將新事務指向舊事務,形成一個事務鏈,是因為新事務在提交或者回滾之后,還需要恢復舊事務:

一文讓你搞懂Spring的統(tǒng)一事務模型

一文讓你搞懂Spring的統(tǒng)一事務模型

這一塊邏輯對應的代碼:

一文讓你搞懂Spring的統(tǒng)一事務模型

一文讓你搞懂Spring的統(tǒng)一事務模型

總結

  • Spring如何實現(xiàn)統(tǒng)一的事務模型:Template + Strategy
  • 如何在方法間共享Connection:ThreadLocal
  • 如何掛起和恢復線程:鏈表
  • 提到的類:
    • TransactionTemplate 事務模板
    • PlatformTransactionManager 事務操作策略接口
    • AbstractPlatformTransactionManager 事務操作策略抽象類
      • DataSourceTxManager 具體策略,適用于JDBC/MyBatis
      • HibernateTxManager 具體策略,適用于Hibernate
    • TxSynManager 事務同步管理器,在線程中同步數(shù)據(jù)庫連接等信息
    • DataSourceUtils 數(shù)據(jù)庫操作Utils

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)站名稱:一文讓你搞懂Spring的統(tǒng)一事務模型-創(chuàng)新互聯(lián)
轉載來源:http://www.muchs.cn/article46/dhjdhg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站網(wǎng)站設計、做網(wǎng)站App開發(fā)、網(wǎng)站策劃、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計