怎么在springBoot中利用service實現(xiàn)層事務(wù)控制的操作-創(chuàng)新互聯(lián)

怎么在springBoot中利用service實現(xiàn)層事務(wù)控制的操作?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創(chuàng)新互聯(lián)服務(wù)緊隨時代發(fā)展步伐,進行技術(shù)革新和技術(shù)進步,經(jīng)過10年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計師、專業(yè)的網(wǎng)站實施團隊以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對網(wǎng)站進行網(wǎng)站設(shè)計、成都網(wǎng)站制作、建設(shè)、維護、更新和改版,實現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

springBoot使用事物比較簡單,在Application啟動類s上添加@EnableTransactionManagement注解,然后在service層的方法上添加@Transactional注解

@Transactional屬性

屬性類型描述
valueString可選的限定描述符,指定使用的事務(wù)管理器
propagationenum: Propagation可選的事務(wù)傳播行為設(shè)置
isolationenum: Isolation可選的事務(wù)隔離級別設(shè)置
readOnlyboolean讀寫或只讀事務(wù),默認讀寫
timeoutint (in seconds granularity)事務(wù)超時時間設(shè)置
rollbackForClass對象數(shù)組,必須繼承自Throwable導致事務(wù)回滾的異常類數(shù)組
rollbackForClassName類名數(shù)組,必須繼承自Throwable導致事務(wù)回滾的異常類名字數(shù)組
noRollbackForClass對象數(shù)組,必須繼承自Throwable不會導致事務(wù)回滾的異常類數(shù)組
noRollbackForClassName類名數(shù)組,必須繼承自Throwable不會導致事務(wù)回滾的異常類名字數(shù)組

用法:

@Transactional 可以作用于接口、接口方法、類以及類方法上。當作用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時,我們也可以在方法級別使用該標注來覆蓋類級別的定義。

雖然 @Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基于接口的代理時它才會生效。

另外, @Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring AOP 的本質(zhì)決定的。

如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。

默認情況下,只有來自外部的方法調(diào)用才會被AOP代理捕獲,也就是,類內(nèi)部方法調(diào)用本類內(nèi)部的其他方法并不會引起事務(wù)行為,即使被調(diào)用方法使用@Transactional注解進行修飾。

注解在方法上:

@Autowired 
private MyBatisDao dao; 
@Transactional 
@Override 
public void insert(Test test) { 
 dao.insert(test); 
 throw new RuntimeException("test");//拋出unchecked異常,觸發(fā)事物,回滾 
}
 @Transactional(noRollbackFor=RuntimeException.class) 
 @Override 
 public void insert(Test test) { 
  dao.insert(test); 
  //拋出unchecked異常,觸發(fā)事物,noRollbackFor=RuntimeException.class,不回滾 
  throw new RuntimeException("test"); 
 }
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
@Override 
public void insert(Test test) { 
 //事物傳播行為是PROPAGATION_NOT_SUPPORTED,以非事務(wù)方式運行,不會存入數(shù)據(jù)庫 
 dao.insert(test); 
}

注解在類上:當作用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性

@Transactional 
public class MyBatisServiceImpl implements MyBatisService { 
 @Autowired 
 private MyBatisDao dao; 
   
 @Override 
 public void insert(Test test) { 
  dao.insert(test); 
  //拋出unchecked異常,觸發(fā)事物,回滾 
  throw new RuntimeException("test"); 
 }

注意:有時候在開發(fā)時往往出現(xiàn)了添加注解后卻無法回滾

原因:默認spring事務(wù)只在發(fā)生未被捕獲的 RuntimeException 時才回滾。

spring aop 異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,默認情況下aop只捕獲 RuntimeException 的異常,但可以通過配置來捕獲特定的異常并回滾

換句話說在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),這樣程序異常時才能被aop捕獲進而回滾。

解決方案:

1.在service層方法拋出RuntimeException異常(如在Catch中需要拋出自定義的異常則只需自定義異常繼承RuntimeException即可),并繼續(xù)捕獲和處理這個異常。

2.在service層方法的catch語句中增加:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

語句,手動回滾,這樣上層就無需去處理異常。

補充:springboot多個service互相調(diào)用的事務(wù)處理

今天,想在一個service的方法A中,調(diào)用另一個service的方法B,方法A和方法B均存在數(shù)據(jù)庫插入操作,并且@Transaction注解也都加了,但是當B方法中拋出異常時,A中的插入語句還是能夠執(zhí)行成功。

注解配置如下:

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)

百思不得其解,再查找了相關(guān)資料后,問題還是出在@Transaction注解的配置上,需要配置異?;貪L。

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED,rollbackFor = Exception.class)

這樣,當B方法中拋出異常時,A中的操作也會進行回滾,事務(wù)就會起到控制作用。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。

當前名稱:怎么在springBoot中利用service實現(xiàn)層事務(wù)控制的操作-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article18/iphgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導航、企業(yè)建站、品牌網(wǎng)站制作、網(wǎng)站設(shè)計品牌網(wǎng)站建設(shè)、商城網(wǎng)站

廣告

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

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