您現在的位置是:首頁 > 遊戲

後端技術盲區大清理:事務還沒弄明白的小夥伴趕緊來看一看

由 Java程式設計技術 發表于 遊戲2021-10-30
簡介Spring事務模型真正的高手是如何解決問題的

後端要學什麼

原創宣告

:吳瀟/Java高階工程師

大家都知道,現在的網際網路後端服務總共分3層:dao層、service層和controller層。今天我們來學習一下dao層與service層之間的資料訪問問題,看看它們之間是怎麼互動的。

dao層與service層之間的互動,簡單說來,就是service層會去呼叫dao層,而在呼叫dao層的時候就必然要用到事務。有些新手朋友在初次寫後端程式的時候,往往不知道這裡有事務問題,以為就像直接呼叫API一樣,呼叫一次insert/update/delete操作就修改一次資料庫,十分簡單明瞭,而且測試也沒發現問題,一切正常。其實這樣寫的程式主要執行在內網、小規模系統環境中,甚至單機執行,這對資料一致性要求不那麼高,所以未出錯。但是一旦部署到線上高併發執行環境中去,資料很有可能不一致,這是因為沒有處理好事務。

另外,後端服務DAO層一般是接入或使用了ORM框架的,例如Hibernate、JPA、MyBatis等。這些框架主要目的是減少樣板程式碼,提高開發效率。這些不同ORM框架的設計差異很大,卻能被Spring框架定義成一套通用的介面,封裝起來供我們使用(題外話:不得不說,Spring開發者的

抽象化和設計能力

真的非常強,值得學習)。

Spring 事務管理

spring的事務管理特別強大,優勢如下:

統一的程式設計模型支援多種不同的事務API,包括JTA、JDBC、Hibernate、JPA等。

宣告式事務管理功能:即只需要宣告,加一個註解就搞定一切了。讓事務功能用起來簡單。

程式設計式事務管理:Spring對底層的事務API進行了抽象和簡化。

能夠高效整合到Spring的資料訪問抽象架構中去,即Spring裡面的DAO。

Spring事務模型

真正的高手是如何解決問題的?他們不是見到一個問題就寫一段程式碼,然後再加上一大堆的條件判斷來限制使用場景。這種解決問題的方式是很原始的。高手則是全面分析問題,把問題中出現的事情進行抽象化,形成一個個的概念,然後再建立起一套模型,把問題統統歸類到新建立起的模型上,最後再針對模型來進行分析、求解和計算。

Spring為了把不同的底層事務API統一,就建立了一個模型,我們姑且叫它為Spring事務模型吧。Spring事務模型是怎麼得來的呢?從Java EE中的全域性事務和區域性事務發展而來。

在Spring之前,後端服務是基於Java EE的。而在Java EE中,資料庫事務功能只有2個選擇:1。 全域性事務 2。本地事務。

Java EE 全域性事務

Java EE中的全域性事務可以管理多個事務資源,例如關係資料庫和訊息佇列,是跨多臺機器的,也就是所謂的“分散式事務”。業務伺服器透過JTA管理全域性事務(API複雜、難用),而且其中用到的UserTransaction必須是從JNDI拿到,導致必須使用JNDI技術。

Java EE 區域性事務

區域性事務只能管理一個事務資源,不能跨機器,且應用伺服器不參與事務管理。大部分流量小的或內網訪問的資料管理系統,使用的是區域性事務。

理解Spring框架事務抽象

事務策略(transaction strategy):這是理解Spring事務抽象的關鍵。事務策略由TransactionManager定義。

後端技術盲區大清理:事務還沒弄明白的小夥伴趕緊來看一看

呼叫TransactionManager#getTransaction,可以傳入TransactionDefinition,可以得到TransactionStatus。

TransactionStatus:代表了一個新建立的事務或者已經存在的事務。

TransactionDefinition:指定各種與事務相關的資訊。

傳播性 (propagation):凡是在事務範圍內的程式碼,都是在這個事務內執行的。對於一段事務程式碼來說,假如一個事務已經存在了,需要用傳播性來指定是:繼續使用已經存在的事務還是把已經存在的事務suspend然後再新建一個事務(Spring事務傳播性的概念其實來自EJB CMT,共有5個,可以在TransactionDefinition的原始碼中找到)

隔離性(isolation):當前事務與其他事務的隔離的程度。例如,當前事務能夠訪問到其他事務的還沒有提交的資料(參考Isolation列舉類)。

超時(timeout):事務執行了多長時間之後依然還沒有完成,則自動回滾。

只讀(read-only):如果事務只讀不修改資料,則可以利用這個引數最佳化效能。

上面4項是事務的核心概念,也是後端程式設計師必然要掌握的基礎知識(面試當然會問),掌握不好的話,寫出來的程式碼訪問資料庫的時候會出問題。

TransactionStatus可以用於控制事務的執行,還可以查詢事務的狀態。

後端技術盲區大清理:事務還沒弄明白的小夥伴趕緊來看一看

TransactionManager負責執行事務,它與底層用到的資料庫框架相關,例如JDBC、JTA、Hibernate分別對應不同的事務管理器(事務管理器)。一般都是Spring預先寫好的。例如,如果底層是透過JDBC訪問資料庫的,那麼事務管理器應該用DataSourceTransactionManager。TransactionManager一般需要依賴一個DataSource,而DataSource一般提供與資料庫相關的更加底層的資訊,包括jdbcref、使用者名稱、密碼等等。

到這裡,你的認知應該有以下迭代了:

後端技術盲區大清理:事務還沒弄明白的小夥伴趕緊來看一看

希望這篇文章能對您有幫助!如果您對網際網路、前/後/客戶端、架構/分散式/高可用/高併發/高實時、電商、Redis、MySQL、Zookeeper、Spring、Android、瀏覽器外掛、Java、C/C++、Linux、個性化推薦、社群發現、機器學習、資料探勘等感興趣,歡迎關注。

後端技術盲區大清理:事務還沒弄明白的小夥伴趕緊來看一看

推薦文章

  • 腦筋急轉彎:悟空扣門八戒開,猜五字俗語!答案笑死人了

    砸下來的是雪花放下屠刀立地成佛薯片(老鼠騙野馬)裡外不是人她在賴床他按的電視開關他還在想沒有人會在蛋糕上插上三長兩短三毛(小明是姐姐)打公用電話肯定要付錢腦筋急轉彎:悟空扣門八戒開 ,猜五字俗語...

  • 想穿出少女感試試這3條連衣裙,又美又清爽,心動感爆棚

    想穿出少女感試試這3條連衣裙,又美又清爽,心動感爆棚不知道從什麼時候開始,已經有越來越多的女生開始愛上了能讓人看上一眼就心動不已的少女感穿搭,但並不是所有女生都知道究竟應該怎樣做才能實現願望,其實穿出符合自己預期的美很簡單,只需要多試試下面這3條連衣裙就可以輕鬆做到,我們一起來看看吧~LOO...

  • 懷孕後還能做家務活嗎?能,但要根據自己的情況而定

    1、家務活方面孕婦分別有哪些能做和不能做的事情首先就是提重物,懷孕期間很多的媽媽也是樂於逛街購物的,尤其是很多給媽媽會喜歡買一些母嬰用品,花果蔬菜,但是準媽媽一定要注意,如果買的東西比較重,可千萬不要提了,因為準媽媽用力去提重物的時候,腹部...