日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

詳解Spring中的Transactional屬性

瀏覽:206日期:2023-07-14 15:11:57
目錄一、Transactional二、使用說明三、注解失效問題一、Transactional

聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是對方法前后進行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。

簡而言之,@Transactional注解在代碼執(zhí)行出錯的時候能夠進行事務(wù)的回滾。

詳解Spring中的Transactional屬性

二、使用說明

詳解Spring中的Transactional屬性

在啟動類上添加@EnableTransactionManagement注解。 用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時,我們也可以在方法級別使用該標(biāo)注來覆蓋類級別的定義。 在項目中,@Transactional(rollbackFor=Exception.class),如果類加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數(shù)據(jù)庫里面的數(shù)據(jù)也會回滾。 在@Transactional注解中如果不配置rollbackFor屬性,那么事物只會在遇到RuntimeException的時候才會回滾,加上rollbackFor=Exception.class,可以讓事物在遇到非運行時異常時也回滾。

而至于什么是運行時異常(RuntimeException),什么是非運行時異常,可通過下圖所示理解(圖片截取網(wǎng)絡(luò))

詳解Spring中的Transactional屬性

三、注解失效問題

正常情況下,只要在方法上添加@Transactional注解就完事了,但是需要注意的是,雖然使用簡單,但是如果不合理地使用注解,還是會存在注解失效的問題。

@Transactional 應(yīng)用在非 public 修飾的方法上

事務(wù)攔截器在目標(biāo)方法執(zhí)行前后進行攔截,內(nèi)部會調(diào)用方法來獲取Transactional 注解的事務(wù)配置信息,調(diào)用前會檢查目標(biāo)方法的修飾符是否為 public,不是 public則不會獲取@Transactional 的屬性配置信息。

@Transactional 注解屬性 rollbackFor 設(shè)置錯誤

rollbackFor 可以指定能夠觸發(fā)事務(wù)回滾的異常類型。Spring默認拋出了未檢查unchecked異常(繼承自 RuntimeException 的異常)或者 Error才回滾事務(wù);其他異常不會觸發(fā)回滾事務(wù)。如果在事務(wù)中拋出其他類型的異常,但卻期望 Spring 能夠回滾事務(wù),就需要指定rollbackFor屬性。

同一個類中方法調(diào)用,導(dǎo)致@Transactional失效

開發(fā)中避免不了會對同一個類里面的方法調(diào)用,比如有一個類Test,它的一個方法A,A再調(diào)用本類的方法B(不論方法B是用public還是private修飾),但方法A沒有聲明注解事務(wù),而B方法有。則外部調(diào)用方法A之后,方法B的事務(wù)是不會起作用的。這也是經(jīng)常犯錯誤的一個地方。那為啥會出現(xiàn)這種情況?其實這還是由于使用Spring AOP代理造成的,因為只有當(dāng)事務(wù)方法被當(dāng)前類以外的代碼調(diào)用時,才會由Spring生成的代理對象來管理。

異常被你的 catch“吃了”導(dǎo)致@Transactional失效

如果你手動的catch捕獲這個異常并進行處理,事務(wù)管理器會認為當(dāng)前事務(wù)應(yīng)該正常commit,就會導(dǎo)致注解失效,如果非要捕獲且不失效,就必須在代碼塊內(nèi)throw new Exception拋出異常。

數(shù)據(jù)庫引擎不支持事務(wù)

開啟事務(wù)的前提就是需要數(shù)據(jù)庫的支持,我們一般使用的Mysql引擎時支持事務(wù)的,所以一般不會出現(xiàn)這種問題。

開啟多線程任務(wù)時,事務(wù)管理會受到影響

因為線程不屬于spring托管,故線程不能夠默認使用spring的事務(wù),也不能獲取spring注入的bean在被spring聲明式事務(wù)管理的方法內(nèi)開啟多線程,多線程內(nèi)的方法不被事務(wù)控制。如下代碼,線程內(nèi)調(diào)用insert方法,spring不會把insert方法加入事務(wù)就算在insert方法上加入@Transactional注解,也不起作用。

@Service public class ServiceA { @Transactional public void threadMethod(){ this.insert(); System.out.println('main insert is over'); for(int a=0 ;a<3;a++){ ThreadOperation threadOperation= new ThreadOperation(); Thread innerThread = new Thread(threadOperation); innerThread.start(); } } public class ThreadOperation implements Runnable { public ThreadOperation(){ } @Override public void run(){ insert(); System.out.println('thread insert is over'); } } public void insert(){ //do insert...... } }

如果把上面insert方法提出到新的類中,加入事務(wù)注解,就能成功的把insert方法加入到事務(wù)管理當(dāng)中

@Service public class ServiceA { @Autowired private ServiceB serviceB; @Transactional public void threadMethod(){ this.insert(); System.out.println('main insert is over'); for(int a=0 ;a<3;a++){ ThreadOperation threadOperation= new ThreadOperation(); Thread innerThread = new Thread(threadOperation); innerThread.start(); } } public class ThreadOperation implements Runnable { public ThreadOperation(){ } @Override public void run(){ serviceB.insert(); System.out.println('thread insert is over'); } } public void insert(){ //do insert...... } } @Service public class ServiceB { @Transactional public void insert(){ //do insert...... } }

另外,使用多線程事務(wù)的情況下,進行回滾,比較麻煩。thread的run方法,有個特別之處,它不會拋出異常,但異常會導(dǎo)致線程終止運行。

最麻煩的是,在線程中拋出的異常即使在主線程中使用try…catch也無法截獲這非常糟糕,我們必須要“感知”到異常的發(fā)生。比如某個線程在處理重要的事務(wù),當(dāng)thread異常終止,我必須要收到異常的報告,才能回滾事務(wù)。這時可以使用線程的UncaughtExceptionHandler進行異常處理,UncaughtExceptionHandler名字意味著處理未捕獲的異常。更明確的說,它處理未捕獲的運行時異常。

如下代碼線程出要使用①處要拋出異常②處要捕捉異常,并且要拋出RuntimeException③處手動處理回滾邏輯

@Service public class ServiceA { @Autowired private ServiceB serviceB; @Transactional public void threadMethod(){ this.insert(); System.out.println('main insert is over'); for(int a=0 ;a<3;a++){ ThreadOperation threadOperation= new ThreadOperation(); Thread innerThread = new Thread(threadOperation); innerThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { try { serviceB.delete();③ } catch (Exception e1) { e1.printStackTrace(); } } }); innerThread.start(); } } public class ThreadOperation implements Runnable { public ThreadOperation(){ } @Override public void run(){ try { serviceB.insert(); }catch (Exception ex){ ② System.out.println(' Exception in run '); throw new RuntimeException(); } System.out.println('thread insert is over'); } } public void insert(){ //do insert...... } } @Service public class ServiceB { @Transactional public void insert() throws Exception{ ① //do insert...... } @Transactional public void delete() throws Exception{ //do delete...... } }

到此這篇關(guān)于詳解Spring中的Transactional屬性的文章就介紹到這了,更多相關(guān)Transactional屬性詳解內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本va欧美va欧美va精品| 成人影视亚洲图片在线| 精品中文字幕一区二区三区四区| 欧美不卡在线| 高清精品久久| 欧美国产不卡| 在线亚洲激情| 视频一区中文| 99久久www免费| 国产不卡精品在线| 国产精品欧美一区二区三区不卡| 亚洲黄页一区| 99精品电影| 久久久777| 日韩啪啪电影网| 成人在线视频中文字幕| 中文字幕成人| 在线精品国产亚洲| 蜜臀久久久久久久| 免费不卡中文字幕在线| 亚洲一级在线| 人人爱人人干婷婷丁香亚洲| 国产乱人伦丫前精品视频| 欧美国产免费| 久久中文视频| 亚洲久久视频| 久久99久久人婷婷精品综合| 久久久久久网| 黄色亚洲在线| 日本午夜精品久久久| 久久久久伊人| 久久久精品日韩| 另类国产ts人妖高潮视频| 日韩国产在线一| 国产精品天天看天天狠| 在线观看精品| 首页亚洲欧美制服丝腿| 国产欧美一区二区三区米奇| 中文字幕人成乱码在线观看| 国产亚洲精品久久久久婷婷瑜伽| 日韩区欧美区| 国产白浆在线免费观看| 久久av一区| 久久不卡国产精品一区二区| 亚洲欧洲高清| 一区二区国产在线观看| 久久三级中文| 一区在线免费观看| 久久av影视| 中文字幕系列一区| 亚洲精品系列| 欧洲av不卡| 日韩亚洲精品在线观看| 精品久久99| 日韩在线观看一区二区| 精品国产不卡一区二区| 亚洲免费激情| 美女视频免费精品| 伊人久久亚洲美女图片| 国产亚洲精aa在线看| 日本在线高清| 亚洲精品韩国| 成人日韩精品| 日韩av中文字幕一区| 视频在线不卡免费观看| 蜜桃久久av一区| 色偷偷色偷偷色偷偷在线视频| 水蜜桃久久夜色精品一区的特点 | 电影天堂国产精品| 日本高清久久| 黄色在线一区| 成人高清一区| 欧美久久久网站| 欧美亚洲国产一区| 国产毛片一区二区三区| 在线日韩中文| 精品伊人久久| 久久亚洲视频| yellow在线观看网址| 亚洲3区在线| 欧美69视频| 岛国精品一区| 91麻豆精品激情在线观看最新| 欧美福利专区| 国产aⅴ精品一区二区三区久久| 亚洲精品亚洲人成在线观看| 欧美福利一区| 国产中文欧美日韩在线| 日韩精彩视频在线观看| 99热精品在线| 999久久久国产精品| 久久99免费视频| 日韩高清电影免费| 久久中文字幕av一区二区不卡| 精品99在线| 国产精品丝袜在线播放| 日韩在线黄色| 午夜在线观看免费一区| 久久国产亚洲精品| 给我免费播放日韩视频| 国产亚洲第一伦理第一区| 亚洲中午字幕| 亚洲午夜精品久久久久久app| 丁香婷婷久久| 国产精品sm| 青草国产精品久久久久久| 日韩专区在线视频| 日韩视频久久| 日韩中文视频| www.51av欧美视频| 久久精品系列| 精品中文字幕一区二区三区四区| 欧美日韩网址| 97精品国产99久久久久久免费| 首页国产欧美久久| 丝袜脚交一区二区| 免费久久99精品国产自在现线| 欧美色图国产精品| 日韩精品看片| 欧美天堂视频| 欧美香蕉视频| 日韩大片在线观看| 五月天av在线| 久久久久伊人| 国产成人免费| 国产精品毛片一区二区在线看| 精品三区视频| 国产一区二区久久久久| 美女av一区| av中文字幕在线观看第一页| 三上亚洲一区二区| 欧产日产国产精品视频| 国产亚洲一区二区手机在线观看 | 亚洲激情中文在线| 午夜久久免费观看| 国产精品97| 夜久久久久久| 日韩制服丝袜av| 日本一区免费网站| 欧美私人啪啪vps| 美腿丝袜在线亚洲一区| 国内在线观看一区二区三区| 久久久久久一区二区| 日韩免费小视频| 狠狠干成人综合网| 日韩精品社区| 国产日韩视频在线| 精品一区91| 欧美日韩视频网站| 9久re热视频在线精品| 亚洲精品在线国产| 国产精品videossex| 亚洲精品永久免费视频| 99热国内精品| 中文字幕一区二区三区四区久久| 欧美在线91| 国产欧美日韩| 国精品产品一区| 欧美日韩亚洲在线观看| 中文字幕在线高清| 欧美日韩国产传媒| 夜夜嗨一区二区三区| 亚洲精品大片| 国产精品99一区二区三| 99免费精品| 日韩精品一区二区三区中文在线| 国产劲爆久久| 久久久久美女| 亚洲日本欧美| 成人污污视频| 亚洲在线观看| 国产精品久久久久久模特 | 久久久久久免费视频| 午夜在线一区| 国产欧美日韩影院| 欧美丝袜一区| 日韩高清电影免费| 日韩欧美国产精品综合嫩v| 男人天堂欧美日韩| 开心激情综合| 香蕉久久国产| 国产一区二区三区成人欧美日韩在线观看 | 亚洲欧美网站| 久久不卡日韩美女| 五月天激情综合网| 欧美日韩 国产精品| 久久久久国产精品一区二区| 一区视频在线| 欧美激情三区| 99pao成人国产永久免费视频| 国产乱码精品一区二区三区亚洲人| 蜜桃av.网站在线观看| 日韩福利视频导航| 国产成人精品亚洲日本在线观看| 亚洲精品系列| 久久天堂精品| 国产精品一区二区三区四区在线观看| 欧美一区二区三区高清视频| 国产精品亚洲片在线播放| 久久精品123|