面試題:@Transactional聲明式事務註解什麼時候會失效 前言 今天來分享一道比較有意思的面試題,“@Transactional聲明式事務註解什麼時候會失效?”。 對於這個問題,我們一起看看考察點和比較好的回答吧! 考察點 這個問題就是面試官想考察我們對@Transactional註解有沒有 ...
面試題:@Transactional聲明式事務註解什麼時候會失效
前言
今天來分享一道比較有意思的面試題,“@Transactional聲明式事務註解什麼時候會失效?”。
對於這個問題,我們一起看看考察點和比較好的回答吧!
考察點
這個問題就是面試官想考察我們對@Transactional註解有沒有深刻的認識,以及日常開發中是否善於積累,認真思考。
回答
下麵我從7個點來回答:
1.聲明式事務主要是得益於SpringAOP,使用一個事務攔截器,在方法的調用前後/周圍進行事務性的增強,來驅動事務的完成。其本質是通過生成一個代理子類,通過重寫父類方法方式實現事務的代理增強!
2.事務失效場景1:註解在非public修飾的方法上,這是Spring強制要求的。
3.事務失效場景2:註解在final關鍵字修飾的方法上。原因是final關鍵字修飾的方法由於不能被子類重寫,所以不能通過代理增強。
4.事務失效場景3:通過this調用方法,this關鍵字在jvm中指的是當前對象,而不是Spring代理後的代理對象,所以不具備事務增強的能力。
5.事務失效場景4:異常被try捕獲,Spring事務預設只會回滾拋出RuntimeException類型異常,如果異常被try,事務不會被回滾。
@Transcational
public void method(){
try{
//業務代碼
}catch(Exception e){
e.printStackTrace();
}
}
6.事務失效場景5:拋出非RuntimeException類型異常且沒有指定rollbackFor。Spring註解事務在沒有手動指定rollbackFor參數的情況下,預設只會回滾拋出RuntimeException異常,可以通過手動指定rollbackFor參數改變這個策略。
7.事務失效場景6:新開線程處理。Spring事務管理器底層是通過ThreadLocal的原理來管理事務(ThreadLocall可以實現多線程下對共用資源訪問的安全性保證)。但是無法控制跨線程之前的事務一致性。
@Transcational
public void methodB(){
new Thread(new Runnable(){
@Override
public void run(){
//insert into xxxx
//update xxx
//throw new RuntimeException
}
});
}
以上就是我對於這個問題的理解。
總結
這個問題主要是考察求職者對Spring中事務基礎能力的掌握。在實際應用中,聲明式事務和編程式事務是非常重要和常見的功能,對於這部分內容如果理解不夠深刻,很容易造成事務不生效的問題。希望讀完這篇文章你有所收穫。歡迎轉發,關註微信公眾號:程式員的故事,瞭解更多精彩面試題。