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

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

詳解Spring中的Transactional屬性

瀏覽:205日期:2023-07-14 15:11:57
目錄一、Transactional二、使用說(shuō)明三、注解失效問(wèn)題一、Transactional

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

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

詳解Spring中的Transactional屬性

二、使用說(shuō)明

詳解Spring中的Transactional屬性

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

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

詳解Spring中的Transactional屬性

三、注解失效問(wèn)題

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

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

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

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

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

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

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

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

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

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

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

開(kāi)啟多線程任務(wù)時(shí),事務(wù)管理會(huì)受到影響

因?yàn)榫€程不屬于spring托管,故線程不能夠默認(rèn)使用spring的事務(wù),也不能獲取spring注入的bean在被spring聲明式事務(wù)管理的方法內(nèi)開(kāi)啟多線程,多線程內(nèi)的方法不被事務(wù)控制。如下代碼,線程內(nèi)調(diào)用insert方法,spring不會(huì)把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方法提出到新的類(lèi)中,加入事務(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ù)的情況下,進(jìn)行回滾,比較麻煩。thread的run方法,有個(gè)特別之處,它不會(huì)拋出異常,但異常會(huì)導(dǎo)致線程終止運(yùn)行。

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

如下代碼線程出要使用①處要拋出異常②處要捕捉異常,并且要拋出RuntimeException③處手動(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.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)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美2区| 97久久亚洲| 欧美一区二区三区久久| 日本欧美在线看| 亚洲一级在线| 男人的天堂亚洲一区| 中文字幕成人| 日韩精品a在线观看91| 日韩精品亚洲专区在线观看| 日韩手机在线| 国产精品成人3p一区二区三区| 国产欧美综合一区二区三区| 国产亚洲一区二区三区啪| 欧美日韩xxxx| 欧美激情网址| 精品视频一区二区三区在线观看 | 亚洲欧美成人综合| 99亚洲视频| 一区二区国产精品| 97久久精品| 欧美激情福利| 久久久久久一区二区| 色天使综合视频| 在线一区电影| 午夜在线观看免费一区| 蜜臀精品久久久久久蜜臀 | 日韩视频一区二区三区在线播放免费观看 | 水蜜桃久久夜色精品一区| 欧美一级鲁丝片| 激情综合在线| 亚洲免费毛片| 欧美激情福利| 激情婷婷亚洲| 日韩黄色av| 中文字幕高清在线播放| 亚洲精品极品少妇16p| 亚洲一区二区小说| 麻豆国产91在线播放| 99国产精品免费视频观看| 午夜在线精品| 久久一区国产| 婷婷成人在线| 亚洲婷婷丁香| 国产aa精品| 欧美日韩视频一区二区三区| 日韩高清不卡在线| 日韩精品专区| 美日韩精品视频| 国产精品宾馆| 欧美va天堂在线| 91免费精品国偷自产在线在线| 美女视频一区在线观看| 国产专区一区| 国产日韩亚洲| 欧美午夜精彩| 国产精品视频一区二区三区四蜜臂| 中文字幕在线免费观看视频| 久久亚洲影院| 欧美国产美女| 亚洲专区视频| 久久精品影视| 日韩av一区二区在线影视| 新版的欧美在线视频| 日韩欧美中文字幕在线视频| 久久男人天堂| 91精品国产一区二区在线观看 | 久久久噜噜噜| 国产免费播放一区二区| 欧美aa国产视频| 久久精品二区亚洲w码| 久久国产精品99国产| 国产夫妻在线| 国产亚洲久久| 日韩中文字幕av电影| 欧美日韩免费观看视频| 久久黄色影视| 性色一区二区| 日韩精品免费一区二区在线观看 | 国产亚洲一区二区手机在线观看| 日韩午夜视频在线| 1024精品久久久久久久久| 久久av影视| 亚洲精品第一| 精品在线99| 国产一区日韩| 欧美一区二区三区久久| 久久不射中文字幕| 久久亚洲成人| 国内精品美女在线观看| 日韩精品免费观看视频| 人人精品亚洲| 精品国产午夜肉伦伦影院| 日韩一区精品| 久久国产88| 亚洲国产专区| 久久电影tv| 精品日产乱码久久久久久仙踪林| 欧美一级一区| 日韩亚洲精品在线观看| 久久亚洲不卡| 国产精品丝袜xxxxxxx| 久久国产中文字幕| 97精品97| 精品久久久久中文字幕小说| 国产伦精品一区二区三区视频| 模特精品在线| 夜夜嗨一区二区| 亚洲特色特黄| 亚洲午夜电影| 激情欧美亚洲| 波多野结衣一区| 亚洲特级毛片| 亚洲天堂久久| 女人av一区| 亚洲成人精选| 国产精品日韩欧美一区| 影音先锋久久| 五月天久久777| 久久国产主播| 欧美freesex黑人又粗又大| 黄色欧美在线| 高清久久一区| 成人在线丰满少妇av| 国产一区二区三区不卡av| 国产精品66| 久久久久伊人| 美女福利一区二区三区| 久久久久久美女精品| 久久久精品五月天| 免费精品国产的网站免费观看| 亚洲男女av一区二区| 先锋影音国产一区| 天堂va在线高清一区| 日本欧美韩国一区三区| 奇米狠狠一区二区三区| 国产精品视频一区二区三区| 国产激情久久| 日韩精品dvd| 1000部精品久久久久久久久| 亚洲精品一区二区妖精| 免费一级片91| 日韩福利视频一区| 久久av网站| 日韩中文在线电影| 亚洲国产综合在线看不卡| 欧美一区=区| 欧美视频久久| 国产一区二区三区四区二区| 欧美日韩国产v| 欧美日韩国产精品一区二区亚洲| 99热精品在线| 亚洲精品美女91| 美日韩一区二区三区| sm久久捆绑调教精品一区| 极品日韩av| 日韩和欧美一区二区| 精品国产一级| 日韩视频在线一区二区三区| 日韩精品久久久久久| 国产一区二区三区不卡视频网站 | 亚洲在线久久| 国产欧美日韩在线一区二区| 麻豆国产91在线播放| 日本韩国欧美超级黄在线观看| 亚洲激情偷拍| 日韩三级视频| а√在线中文在线新版| 狠狠爱www人成狠狠爱综合网| 日韩国产欧美三级| 国产精品99久久免费观看| 久久免费国产| 亚洲精品影视| 精品高清久久| 亚洲在线网站| 久久av免费看| 99精品99| 精品久久久久久久| 亚洲自拍另类| 蜜桃久久久久| 夜夜嗨一区二区三区| 国产精品xxx在线观看| 999久久久91| 国产欧美亚洲一区| 亚洲精品2区| 国产精品99久久免费观看| 99国产精品自拍| 久久精品亚洲| 韩日一区二区三区| 国产欧美一区二区精品久久久| 中文字幕系列一区| 国产日韩一区| 五月精品视频| 麻豆精品新av中文字幕| 精品中文字幕一区二区三区av| 国产精品美女久久久久久不卡| 欧美粗暴jizz性欧美20| 国产调教一区二区三区| 激情五月综合网| 久久精品一区二区国产| 国产中文一区|