一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - springBoot service層事務控制的操作

springBoot service層事務控制的操作

2021-08-12 11:06大大大圣 Java教程

這篇文章主要介紹了springBoot service層事務控制的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

@Transactional屬性

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

用法:

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

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

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

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

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

注解在方法上:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
@Transactional
public class MyBatisServiceImpl implements MyBatisService {
 @Autowired
 private MyBatisDao dao;
   
 @Override
 public void insert(Test test) {
  dao.insert(test);
  //拋出unchecked異常,觸發事物,回滾
  throw new RuntimeException("test");
 }

注意:有時候在開發時往往出現了添加注解后卻無法回滾

原因:默認spring事務只在發生未被捕獲的 RuntimeException 時才回滾。

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

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

解決方案:

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

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

?
1
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

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

補充:springboot多個service互相調用的事務處理

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

注解配置如下:

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

百思不得其解,再查找了相關資料后,問題還是出在@Transaction注解的配置上,需要配置異常回滾。

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

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://www.cnblogs.com/tongxuping/p/7650293.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 3d动漫美女被吸乳羞羞有 | asian4you裸模 | 欧美日韩一区二区中文字幕视频 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 精品在线免费观看视频 | 人妖三级| 国产精品一级视频 | 亚洲精品欧洲久久婷婷99 | 欧美色精品天天在线观看视频 | 国产精品香蕉夜间视频免费播放 | 拍拍叫痛的无挡视频免费 | 91欧洲在线视精品在亚洲 | 黄色大片网 | 国产自在自线午夜精品之la | 久久精品男人影院 | 春意影院午夜爽爽爽免费 | 国产麻豆传媒在线观看 | 成年人免费在线看 | 91粉色视频在线导航 | 国产一成人精品福利网站 | 丝瓜视频黄瓜视频 | 四影虎库最新2021 | 国产网站免费观看 | gay男男白袜chinese | 91制片厂制作果冻传媒123 | 欧美人与牲动交xxx 欧美人妖另类性hd 欧美人人干 | 男人疯狂进女人下部视频动漫 | 精品视频日本 | 日本在线观看www鲁啊鲁视频 | 动漫美女胸被狂揉扒开吃奶动态图 | 农夫69小说恋老妇小说 | 黑人巨大精品战中国美女 | 国产成人精品日本亚洲网址 | 91视频破解版 | 色中文网| 44444色视频在线观看 | 国产91精品久久久久久 | 国产高清视频免费最新在线 | 亚洲高清在线天堂精品 | 四虎影视库永久在线地址 | 白丝萝莉喷水 |