色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:2日期:2023-03-24 15:00:09

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

@Transactional屬性 屬性 類型 描述 value String 可選的限定描述符,指定使用的事務(wù)管理器 propagation enum: Propagation 可選的事務(wù)傳播行為設(shè)置 isolation enum: Isolation 可選的事務(wù)隔離級別設(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 不會導(dǎo)致事務(wù)回滾的異常類數(shù)組 noRollbackForClassName 類名數(shù)組,必須繼承自Throwable 不會導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組用法:

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

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

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

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

默認(rèn)情況下,只有來自外部的方法調(diào)用才會被AOP代理捕獲,也就是,類內(nèi)部方法調(diào)用本類內(nèi)部的其他方法并不會引起事務(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)行,不會存入數(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();

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

補(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注解的配置上,需要配置異常回滾。

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

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

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

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 在线观看国产一区二区三区99 | 久久两性视频 | 欧美高清性色生活片免费观看 | 不卡一区二区在线 | 美女视频黄免费 | 国产精品美女视视频专区 | 日本美女黄色一级片 | 欧美成人私人视频88在线观看 | 高清视频一区 | 欧美性视频一区二区三区 | 99国产在线播放 | 午夜丝袜美腿福利视频在线看 | 国产高清在线 | 性生大片一级毛片免费观看 | 91.久久| 久久香焦 | 美女mm131爽爽爽免费视色 | 欧美日韩一区二区在线观看视频 | 免费99热在线观看 | 国产成a人亚洲精v品久久网 | 91九色国产porny | 免费看a| 国产精品毛片va一区二区三区 | 欧美日韩高清不卡免费观看 | 亚洲综合第一区 | 99在线免费观看视频 | 国产成人精品男人的天堂538 | 久久福利青草精品资源站 | 九九久久久久午夜精选 | 午夜影院啪啪 | 久草在线在线 | 免费观看欧美性一级 | 99精品国产成人一区二区 | 国内精品久久久久久中文字幕 | 欧美成人午夜在线全部免费 | 免费一区二区三区视频狠狠 | 欧美极品在线播放 | 国产在线视频一区二区三区 | 日韩欧美一区二区三区免费看 | 国产成人久久 | 日韩精品中文字幕在线观看 |