Spring非同步Async和事務Transactional註解

程式設計師xiaozhang發表於2023-02-05

Spring開發中我們我們常常用到@Transaction和@Async,但這2個註解加在一起很多的開發者不敢用,擔心事務不生效。下面我們就仔細講解一下這2個註解同時運用,文章用3個場景講述它們之間的運用,相信看完本篇文章你就能靈活運用這2個註解了。

場景一:@Async + @Transaction放在一個方法中,並且方法有異常發生

 

進行單元測試如下:

 

執行結果:事務回滾了,user沒有新增進入資料庫。

場景二:一個同步的方法,呼叫非同步的方法,同步的方法丟擲異常。

 

圖片

然後同樣執行上面的單測。PS至於上面為什麼用applicationContext獲取Bean不在本次講解的範疇,是屬於事務是否生效的知識點,如果想知道為什麼後續文章進行講解,可以點一下關注。

結果:第一個方法資料回滾了,第二個非同步的資料儲存成功了。

場景三:一個同步方法,呼叫2個非同步的方法,2個非同步的方法都丟擲異常。

 

同樣執行上面的單測。

結論:第一個同步方法儲存資料成功,第二個和第三個非同步方法儲存資料失敗。

上面的三個場景大概,概括了我們開發中的使用的場景,由上面的場景也可以得出結論:不同執行緒之間的事務完全隔離,非同步執行緒內完全可以呼叫非同步執行緒。

然後我們講解一下第一種場景為什麼事務加非同步的方法能生效,大部分的開發者都對此有疑問。因為事務生效只在同一個執行緒中才能生效而使用非同步方法時Sping又新建立了一個執行緒,以為這個事務不生效的,其實是生效的。我們知道不管是非同步還是事務都是Spring運用了它的特性Aop。Aop中切面有一個執行順序的註解,如下是Spring事務的預設的order

int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

 

spring事務切面order為最大的整數值,也就是說它的執行優先順序是最低的。所以可以知道Async非同步的切面先執行,事務的切面後執行,通俗理解非同步包裹了事務的執行,所以可以說事務是在非同步的那個執行緒裡面執行的,所以也就理解了為什麼事務會生效。

微信公眾號搜尋:程式設計師xiaozhang 。如果遇到Spring的問題也可以私信我 能幫忙解決的儘量解決

 

 

相關文章