中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做網(wǎng)站機(jī)構(gòu)搜狗網(wǎng)址導(dǎo)航

做網(wǎng)站機(jī)構(gòu),搜狗網(wǎng)址導(dǎo)航,宿州網(wǎng)絡(luò)科技有限公司,吉林省白山市建設(shè)廳網(wǎng)站首頁(yè)事務(wù)管理方式 在Spring中,事務(wù)有兩種實(shí)現(xiàn)方式,分別是編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。 編程式事務(wù)管理: 編程式事務(wù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對(duì)于編程式事務(wù)管理,sp…

事務(wù)管理方式

在Spring中,事務(wù)有兩種實(shí)現(xiàn)方式,分別是編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。

  • 編程式事務(wù)管理: 編程式事務(wù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對(duì)于編程式事務(wù)管理,spring推薦使用TransactionTemplate。
  • 聲明式事務(wù)管理: 建立在AOP之上的。其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后在目標(biāo)方法開(kāi)始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。 聲明式事務(wù)管理不需要入侵代碼,通過(guò)@Transactional就可以進(jìn)行事務(wù)操作,更快捷而且簡(jiǎn)單,推薦使用。
編程式事務(wù)管理:

1、使用 TransactionTemplate 來(lái)管理事務(wù):

@Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {try {// ....  業(yè)務(wù)代碼} catch (Exception e){//回滾transactionStatus.setRollbackOnly();}}});
}

?2、使用 TransactionManager 來(lái)管理事務(wù):

@Autowired
private PlatformTransactionManager transactionManager;
public void testTransaction() {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// ....  業(yè)務(wù)代碼transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}
}
聲明式事務(wù)管理:
@Transactionalpublic void testTransactional(){}

事務(wù)提交方式

默認(rèn)情況下,數(shù)據(jù)庫(kù)處于自動(dòng)提交模式。

每一條語(yǔ)句處于一個(gè)單獨(dú)的事務(wù)中,在這條語(yǔ)句執(zhí)行完畢時(shí),如果執(zhí)行成功則隱式的提交事務(wù),如果執(zhí)行失敗則隱式的回滾事務(wù)。

對(duì)于正常的事務(wù)管理,是一組相關(guān)的操作處于一個(gè)事務(wù)之中,因此必須關(guān)閉數(shù)據(jù)庫(kù)的自動(dòng)提交模式。

不過(guò),這個(gè)我們不用擔(dān)心,spring會(huì)將底層連接的自動(dòng)提交特性設(shè)置為false。

也就是在使用spring進(jìn)行事物管理的時(shí)候,spring會(huì)將是否自動(dòng)提交設(shè)置為false,等價(jià)于JDBC中的 connection.setAutoCommit(false);,在執(zhí)行完之后在進(jìn)行提交,connection.commit(); 。

事務(wù)隔離級(jí)別

隔離級(jí)別是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度。

TransactionDefinition 接口中定義了五個(gè)表示隔離級(jí)別的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:這是默認(rèn)值,表示使用底層數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別。對(duì)大部分?jǐn)?shù)據(jù)庫(kù)而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級(jí)別表示一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)修改但還沒(méi)有提交的數(shù)據(jù)。該級(jí)別不能防止臟讀,不可重復(fù)讀和幻讀,因此很少使用該隔離級(jí)別。比如PostgreSQL實(shí)際上并沒(méi)有此級(jí)別。
  • TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級(jí)別表示一個(gè)事務(wù)只能讀取另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)。該級(jí)別可以防止臟讀,這也是大多數(shù)情況下的推薦值。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級(jí)別表示一個(gè)事務(wù)在整個(gè)過(guò)程中可以多次重復(fù)執(zhí)行某個(gè)查詢(xún),并且每次返回的記錄都相同。該級(jí)別可以防止臟讀和不可重復(fù)讀。
  • TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個(gè)執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說(shuō),該級(jí)別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能。通常情況下也不會(huì)用到該級(jí)別。

事務(wù)傳播行為

當(dāng)事務(wù)方法被另外一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播,例如,方法可能繼續(xù)在當(dāng)前事務(wù)中執(zhí)行,也可以開(kāi)啟一個(gè)新的事務(wù),在自己的事務(wù)中執(zhí)行。

  • TransactionDefinition.PROPAGATION_REQUIRED:默認(rèn)的事務(wù)傳播行為,指的是如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。更確切地意思是: 如果外部方法沒(méi)有開(kāi)啟事務(wù)的話,Propagation.REQUIRED 修飾的內(nèi)部方法會(huì)開(kāi)啟自己的事務(wù),且開(kāi)啟的事務(wù)相互獨(dú)立,互不干擾。 如果外部方法開(kāi)啟事務(wù)并且是 Propagation.REQUIRED 的話,所有 Propagation.REQUIRED 修飾的內(nèi)部方法和外部方法均屬于同一事務(wù) ,只要一個(gè)方法回滾,整個(gè)事務(wù)都需要回滾。

也就是說(shuō)如果a方法和b方法都添加了注解,在默認(rèn)傳播模式下,a方法內(nèi)部調(diào)用b方法,會(huì)把兩個(gè)方法的事務(wù)合并為一個(gè)事務(wù)。

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說(shuō)不管外部方法是否開(kāi)啟事務(wù),Propagation.REQUIRES_NEW 修飾的內(nèi)部方法都會(huì)開(kāi)啟自己的事務(wù),且開(kāi)啟的事務(wù)與外部的事務(wù)相互獨(dú)立,互不干擾。當(dāng)類(lèi)A中的 a 方法用默認(rèn) Propagation.REQUIRED模式,類(lèi)B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中調(diào)用 b方法操作數(shù)據(jù)庫(kù),然而 a方法拋出異常后,b方法并沒(méi)有進(jìn)行回滾,因?yàn)镻ropagation.REQUIRES_NEW會(huì)暫停 a方法的事務(wù) ,總結(jié)就是a不影響b,b影響a
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。

事務(wù)回滾規(guī)則

指示spring事務(wù)管理器回滾一個(gè)事務(wù)的推薦方法是在當(dāng)前事務(wù)的上下文內(nèi)拋出異常。

spring事務(wù)管理器會(huì)捕捉任何未處理的異常,然后依據(jù)規(guī)則決定是否回滾拋出異常的事務(wù)。

默認(rèn)配置下,spring只有在拋出的異常為運(yùn)行時(shí)unchecked異常時(shí)才回滾該事務(wù),也就是拋出的異常為RuntimeException的子類(lèi)(Errors也會(huì)導(dǎo)致事務(wù)回滾),而拋出checked異常則不會(huì)導(dǎo)致事務(wù)回滾。

可以明確的配置在拋出那些異常時(shí)回滾事務(wù),包括checked異常。

也可以明確定義那些異常拋出時(shí)不回滾事務(wù)。

事務(wù)常用配置

  • readOnly:該屬性用于設(shè)置當(dāng)前事務(wù)是否為只讀事務(wù),設(shè)置為true表示只讀,false則表示可讀寫(xiě),默認(rèn)值為false。例如:@Transactional(readOnly=true);
  • rollbackFor: 該屬性用于設(shè)置需要進(jìn)行回滾的異常類(lèi)數(shù)組,當(dāng)方法中拋出指定異常數(shù)組中的異常時(shí),則進(jìn)行事務(wù)回滾。例如:指定單一異常類(lèi):@Transactional(rollbackFor=RuntimeException.class)指定多個(gè)異常類(lèi):@Transactional(rollbackFor={RuntimeException.class, Exception.class});
  • rollbackForClassName: 該屬性用于設(shè)置需要進(jìn)行回滾的異常類(lèi)名稱(chēng)數(shù)組,當(dāng)方法中拋出指定異常名稱(chēng)數(shù)組中的異常時(shí),則進(jìn)行事務(wù)回滾。例如:指定單一異常類(lèi)名稱(chēng)@Transactional(rollbackForClassName=”RuntimeException”)指定多個(gè)異常類(lèi)名稱(chēng):@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})。
  • noRollbackFor:該屬性用于設(shè)置不需要進(jìn)行回滾的異常類(lèi)數(shù)組,當(dāng)方法中拋出指定異常數(shù)組中的異常時(shí),不進(jìn)行事務(wù)回滾。例如:指定單一異常類(lèi):@Transactional(noRollbackFor=RuntimeException.class)指定多個(gè)異常類(lèi):@Transactional(noRollbackFor={RuntimeException.class, Exception.class})。
  • noRollbackForClassName:該屬性用于設(shè)置不需要進(jìn)行回滾的異常類(lèi)名稱(chēng)數(shù)組,當(dāng)方法中拋出指定異常名稱(chēng)數(shù)組中的異常時(shí),不進(jìn)行事務(wù)回滾。例如:指定單一異常類(lèi)名稱(chēng):@Transactional(noRollbackForClassName=”RuntimeException”)指定多個(gè)異常類(lèi)名稱(chēng):@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})。
  • propagation : 該屬性用于設(shè)置事務(wù)的傳播行為。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)。
  • isolation:該屬性用于設(shè)置底層數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別,事務(wù)隔離級(jí)別用于處理多事務(wù)并發(fā)的情況,通常使用數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別即可,基本不需要進(jìn)行設(shè)置。
  • timeout:該屬性用于設(shè)置事務(wù)的超時(shí)秒數(shù),默認(rèn)值為-1表示永不超時(shí)。也就是指一個(gè)事務(wù)所允許執(zhí)行的最長(zhǎng)時(shí)間,如果在超時(shí)時(shí)間內(nèi)還沒(méi)有完成的話,就自動(dòng)回滾。假如事務(wù)的執(zhí)行時(shí)間格外的長(zhǎng),由于事務(wù)涉及到對(duì)數(shù)據(jù)庫(kù)的鎖定,就會(huì)導(dǎo)致長(zhǎng)時(shí)間運(yùn)行的事務(wù)占用數(shù)據(jù)庫(kù)資源。

@Transaction失效場(chǎng)景

1、訪問(wèn)權(quán)限問(wèn)題 (只有public方法會(huì)生效)

java的訪問(wèn)權(quán)限主要有四種:private、default、protected、public,它們的權(quán)限從左到右,依次變大。spring要求被代理方法必須得是public的。

我們自定義的事務(wù)方法如果它的訪問(wèn)權(quán)限不是public,會(huì)導(dǎo)致事務(wù)失效。

 	@Transactionalprivate void testTransactional() {}
2、方法用final修飾,不會(huì)生效

有時(shí)候,某個(gè)方法不想被子類(lèi)重新,這時(shí)可以將該方法定義成final的。

普通方法這樣定義是沒(méi)問(wèn)題的,但如果將事務(wù)方法定義成final,會(huì)導(dǎo)致事務(wù)失效

 	@Transactionalpublic final void testTransactional() {}
3、同一個(gè)類(lèi)中的方法直接內(nèi)部調(diào)用,會(huì)導(dǎo)致事務(wù)失效
@Service
public class TransactionalTest implements TransactionalService{@Overridepublic  void testTransactional() {transactional();}@Transactionalpublic  void  transactional(){}
}

文章開(kāi)頭說(shuō)道,聲明式事務(wù)管理是建立在AOP之上的。AOP的實(shí)現(xiàn)原理是動(dòng)態(tài)代理。

一個(gè)方法調(diào)用本類(lèi)的其他方法是不會(huì)走代理,原因是在InvocationHandlerImpl#invoke中method.invoke(subject, args);

這里調(diào)用的是目標(biāo)類(lèi)subject的方法,直接執(zhí)行目標(biāo)類(lèi)方法,不會(huì)執(zhí)行代理類(lèi)的方法。?

因?yàn)镴DK動(dòng)態(tài)代理采用的是接口實(shí)現(xiàn)的方式,通過(guò)反射調(diào)用目標(biāo)類(lèi)的方法,此時(shí)如果調(diào)用本類(lèi)的方法,this指的是目標(biāo)類(lèi),并不是代理類(lèi)所以不會(huì)走代理。

不走代理,事務(wù)自然會(huì)失效。

編寫(xiě)新的sevice

這個(gè)方法非常簡(jiǎn)單,只需要新加一個(gè)Service方法,把@Transactional注解加到新Service方法上,把需要事務(wù)執(zhí)行的代碼移到新方法中。

自己注入自己

@Service
public class TransactionalTest implements TransactionalService{@Resourceprivate TransactionalTest transactionalTest;@Overridepublic  void testTransactional() {transactionalTest.transactional();}@Transactionalpublic  void  transactional(){}
}

如果不想再新加一個(gè)Service類(lèi),在該Service類(lèi)中注入自己。

完全不用擔(dān)心循環(huán)依賴(lài)的問(wèn)題,spring ioc內(nèi)部的三級(jí)緩存保證了它,不會(huì)出現(xiàn)循環(huán)依賴(lài)問(wèn)題。

4、事務(wù)方法中使用try-catch捕獲處理
@Transactionalpublic  void  transactional(){try{....}catch(Exception e){logger.error("",e);}}

事務(wù)@Transactional由spring控制時(shí),它會(huì)在拋出異常的時(shí)候進(jìn)行回滾。如果自己使用try-catch捕獲處理了,是不生效的。

如果想事務(wù)生效可以進(jìn)行手動(dòng)回滾或者在catch里面將異常拋出【throw new RuntimeException();】

事務(wù)手動(dòng)回滾

try{...
}catch(Exception e){log.error("fail",e);TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return false;
}

回滾部分異常 使用【Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 】設(shè)置回滾點(diǎn)。

使用【TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);】回滾到savePoint。

@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder (){  success();  //只回滾以下異常,Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();try {  exception(); } catch (Exception e) {  e.printStackTrace();     // 手工回滾事務(wù)TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);return response.error();}  return response.success();
}

http://www.risenshineclean.com/news/53917.html

相關(guān)文章:

  • 朝陽(yáng)區(qū)手機(jī)網(wǎng)站建設(shè)服務(wù)百度搜索風(fēng)云榜手機(jī)版
  • 自己這么做網(wǎng)站瀏覽器打開(kāi)是2345網(wǎng)址導(dǎo)航
  • 網(wǎng)站建設(shè)江陰高端網(wǎng)站定制開(kāi)發(fā)
  • 西安網(wǎng)站建設(shè)陽(yáng)建seo網(wǎng)站排名優(yōu)化公司
  • zhaosf做這樣網(wǎng)站競(jìng)價(jià)托管哪家公司好
  • 鄭州網(wǎng)站開(kāi)發(fā)比較好的網(wǎng)絡(luò)公司網(wǎng)絡(luò)營(yíng)銷(xiāo)管理
  • 如何不要錢(qián)做網(wǎng)站營(yíng)銷(xiāo)模式有幾種
  • 在西寧做網(wǎng)站可以嗎目前小說(shuō)網(wǎng)站排名
  • 網(wǎng)站開(kāi)發(fā)與維護(hù)工資多少西安百度公司官網(wǎng)
  • 做教育的網(wǎng)站有哪些指數(shù)
  • 武進(jìn)區(qū)城鄉(xiāng)建設(shè)局網(wǎng)站營(yíng)銷(xiāo)網(wǎng)站搭建
  • 楊浦做網(wǎng)站公司買(mǎi)賣(mài)交易平臺(tái)
  • 網(wǎng)站建設(shè)方案書(shū)是什么意思近期新聞事件
  • 自己做的網(wǎng)站打不開(kāi)外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)介紹
  • 做網(wǎng)站特別注意什么軟文廣告平臺(tái)
  • 采購(gòu)網(wǎng)站平臺(tái)電商軟文范例100字
  • 做網(wǎng)站北京公司西安seo關(guān)鍵詞推廣
  • 電子商務(wù)網(wǎng)站的建設(shè)目標(biāo)是什么關(guān)鍵詞優(yōu)化軟件
  • 咨詢(xún)網(wǎng)站 模板高端網(wǎng)站建設(shè)企業(yè)
  • 網(wǎng)頁(yè)設(shè)計(jì)素材 旅游seo服務(wù)商
  • 國(guó)外網(wǎng)站模版免費(fèi)下載百度電腦版下載
  • 娃哈哈網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃方案佛山seo培訓(xùn)機(jī)構(gòu)
  • 天津有哪些有名的網(wǎng)站建設(shè)公司近三天時(shí)政熱點(diǎn)
  • wordpress文章發(fā)布到專(zhuān)題江蘇網(wǎng)站seo
  • 企業(yè)門(mén)戶(hù)網(wǎng)站包括品牌營(yíng)銷(xiāo)策劃有限公司
  • 培訓(xùn)人員網(wǎng)站建設(shè)建站教程
  • 安徽科技學(xué)院官網(wǎng)百度seo sem
  • 加強(qiáng)縣政府網(wǎng)站建設(shè)的幾點(diǎn)建議連云港seo優(yōu)化公司
  • 做h網(wǎng)站風(fēng)險(xiǎn)網(wǎng)站如何優(yōu)化排名
  • 建站公司的工作流程百度熱議