欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springBoot service層事務(wù)控制的操作

 更新時(shí)間:2021年02月22日 16:28:52   作者:大大大圣  
這篇文章主要介紹了springBoot service層事務(wù)控制的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

@Transactional屬性

屬性 類型 描述
value String 可選的限定描述符,指定使用的事務(wù)管理器
propagation enum: Propagation 可選的事務(wù)傳播行為設(shè)置
isolation enum: Isolation 可選的事務(wù)隔離級(jí)別設(shè)置
readOnly boolean 讀寫或只讀事務(wù),默認(rèn)讀寫
timeout int (in seconds granularity) 事務(wù)超時(shí)時(shí)間設(shè)置
rollbackFor Class對象數(shù)組,必須繼承自Throwable 導(dǎo)致事務(wù)回滾的異常類數(shù)組
rollbackForClassName 類名數(shù)組,必須繼承自Throwable 導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組
noRollbackFor Class對象數(shù)組,必須繼承自Throwable 不會(huì)導(dǎo)致事務(wù)回滾的異常類數(shù)組
noRollbackForClassName 類名數(shù)組,必須繼承自Throwable 不會(huì)導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組

用法:

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

雖然 @Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會(huì)生效。

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

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

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

注解在方法上:

@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ù)方式運(yùn)行,不會(huì)存入數(shù)據(jù)庫 
 dao.insert(test); 
} 

注解在類上:當(dāng)作用于類上時(shí),該類的所有 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"); 
 } 

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

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

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

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

解決方案:

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

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

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

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

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

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

注解配置如下:

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

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

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Maven 打包項(xiàng)目到私服 (deploy)的配置方法

    Maven 打包項(xiàng)目到私服 (deploy)的配置方法

    這篇文章主要介紹了Maven 打包項(xiàng)目到私服 (deploy)的配置方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java使用lambda自定義Arrays.sort排序規(guī)則說明

    Java使用lambda自定義Arrays.sort排序規(guī)則說明

    這篇文章主要介紹了Java使用lambda自定義Arrays.sort排序規(guī)則說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 淺談Java垃圾回收機(jī)制

    淺談Java垃圾回收機(jī)制

    Java 中,程序員不需要關(guān)心所有不再使用的對象。垃圾回收機(jī)制自動(dòng)銷毀這些對象。垃圾回收機(jī)制是守護(hù)線程的最佳示例,因?yàn)樗冀K在后臺(tái)運(yùn)行。垃圾回收機(jī)制的主要目標(biāo)是通過銷毀無法訪問的對象來釋放堆內(nèi)存。下面我們就來詳細(xì)介紹吧
    2021-09-09
  • Spring?Security中如何獲取AuthenticationManager對象

    Spring?Security中如何獲取AuthenticationManager對象

    有時(shí)需要使用AuthenticationManager(以下簡稱Manager)對象,可是這個(gè)對象不是Bean,沒有直接保存在Spring的Bean庫中,那么如何獲取Spring Security中的這個(gè)對象呢,需要的朋友可以參考下
    2022-11-11
  • Spring中的Lifecycle接口使用與源碼分析

    Spring中的Lifecycle接口使用與源碼分析

    這篇文章主要介紹了Spring中的Lifecycle接口使用與源碼分析,LifeCycle接口定義了Spring容器的生命周期,任何被Spring管理的對象都可以實(shí)現(xiàn)該接口,需要的朋友可以參考下
    2023-05-05
  • nacos-discovery包名層級(jí)問題解決

    nacos-discovery包名層級(jí)問題解決

    這篇文章主要為大家介紹了nacos-discovery包名層級(jí)問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 使用Spring?Boot的原因解析

    使用Spring?Boot的原因解析

    Spring Boot是Spring家族的成員,它是一個(gè)全新的框架,它的設(shè)計(jì)目的是盡可能簡單和快速的開發(fā)、運(yùn)行Spring應(yīng)用程序,簡化配置,這篇文章主要介紹了為什么使用Spring?Boot,需要的朋友可以參考下
    2022-07-07
  • Java泛型通配符的使用詳解

    Java泛型通配符的使用詳解

    本文主要介紹了Java泛型通配符的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java 使用DecimalFormat進(jìn)行數(shù)字的格式化實(shí)例詳解

    java 使用DecimalFormat進(jìn)行數(shù)字的格式化實(shí)例詳解

    這篇文章主要介紹了java 使用DecimalFormat進(jìn)行數(shù)字的格式化實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java如何使用遞歸查詢多級(jí)樹形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)

    Java如何使用遞歸查詢多級(jí)樹形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)

    這篇文章主要介紹了Java如何使用遞歸查詢多級(jí)樹形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論