Spring中事務(wù)傳播行為的示例分析

這篇文章主要為大家展示了“Spring中事務(wù)傳播行為的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Spring中事務(wù)傳播行為的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今,先為平原等服務(wù)建站,平原等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為平原企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

事務(wù)傳播行為介紹

Spring中的7個(gè)事務(wù)傳播行為:

|事務(wù)行為|說(shuō)明 |
|:--|:--|
|PROPAGATION_REQUIRED | 支持當(dāng)前事務(wù),假設(shè)當(dāng)前沒(méi)有事務(wù)。就新建一個(gè)事務(wù) |
| PROPAGATION_SUPPORTS |支持當(dāng)前事務(wù),假設(shè)當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式運(yùn)行 |
| PROPAGATION_MANDATORY| 支持當(dāng)前事務(wù),假設(shè)當(dāng)前沒(méi)有事務(wù),就拋出異常|
| PROPAGATION_REQUIRES_NEW | 新建事務(wù),假設(shè)當(dāng)前存在事務(wù)。把當(dāng)前事務(wù)掛起|
|PROPAGATION_NOT_SUPPORTED | 以非事務(wù)方式運(yùn)行操作。假設(shè)當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起 |
| PROPAGATION_NEVER | 以非事務(wù)方式運(yùn)行,假設(shè)當(dāng)前存在事務(wù),則拋出異常 |
| PROPAGATION_NESTED |如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。 |

舉例說(shuō)明

案例代碼

ServiceA

ServiceA { 
  void methodA() {
   ServiceB.methodB();
  }
}

ServiceB

ServiceB { 
  void methodB() {
  }  
}

1.PROPAGATION_REQUIRED

??假如當(dāng)前正要運(yùn)行的事務(wù)不在另外一個(gè)事務(wù)里,那么就起一個(gè)新的事務(wù) 比方說(shuō),ServiceB.methodB的事務(wù)級(jí)別定義PROPAGATION_REQUIRED, 那么因?yàn)閳?zhí)行ServiceA.methodA的時(shí)候,ServiceA.methodA已經(jīng)起了事務(wù)。這時(shí)調(diào)用ServiceB.methodB,ServiceB.methodB看到自己已經(jīng)執(zhí)行在ServiceA.methodA的事務(wù)內(nèi)部。就不再起新的事務(wù)。而假如ServiceA.methodA執(zhí)行的時(shí)候發(fā)現(xiàn)自己沒(méi)有在事務(wù)中,他就會(huì)為自己分配一個(gè)事務(wù)。這樣,在ServiceA.methodA或者在ServiceB.methodB內(nèi)的不論什么地方出現(xiàn)異常。事務(wù)都會(huì)被回滾。即使ServiceB.methodB的事務(wù)已經(jīng)被提交,可是ServiceA.methodA在接下來(lái)fail要回滾,ServiceB.methodB也要回滾

Spring中事務(wù)傳播行為的示例分析

2.PROPAGATION_SUPPORTS

??假設(shè)當(dāng)前在事務(wù)中。即以事務(wù)的形式執(zhí)行。假設(shè)當(dāng)前不在一個(gè)事務(wù)中,那么就以非事務(wù)的形式執(zhí)行

3PROPAGATION_MANDATORY

??必須在一個(gè)事務(wù)中執(zhí)行。也就是說(shuō),他僅僅能被一個(gè)父事務(wù)調(diào)用。否則,他就要拋出異常

4.PROPAGATION_REQUIRES_NEW

??這個(gè)就比較繞口了。 比方我們?cè)O(shè)計(jì)ServiceA.methodA的事務(wù)級(jí)別為PROPAGATION_REQUIRED,ServiceB.methodB的事務(wù)級(jí)別為PROPAGATION_REQUIRES_NEW。那么當(dāng)運(yùn)行到ServiceB.methodB的時(shí)候,ServiceA.methodA所在的事務(wù)就會(huì)掛起。ServiceB.methodB會(huì)起一個(gè)新的事務(wù)。等待ServiceB.methodB的事務(wù)完畢以后,他才繼續(xù)運(yùn)行。
他與PROPAGATION_REQUIRED 的事務(wù)差別在于事務(wù)的回滾程度了。由于ServiceB.methodB是新起一個(gè)事務(wù),那么就是存在兩個(gè)不同的事務(wù)。假設(shè)ServiceB.methodB已經(jīng)提交,那么ServiceA.methodA失敗回滾。ServiceB.methodB是不會(huì)回滾的。假設(shè)ServiceB.methodB失敗回滾,假設(shè)他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務(wù)仍然可能提交。

Spring中事務(wù)傳播行為的示例分析

5.PROPAGATION_NOT_SUPPORTED

??當(dāng)前不支持事務(wù)。比方ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED 。而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NOT_SUPPORTED ,那么當(dāng)執(zhí)行到ServiceB.methodB時(shí)。ServiceA.methodA的事務(wù)掛起。而他以非事務(wù)的狀態(tài)執(zhí)行完,再繼續(xù)ServiceA.methodA的事務(wù)。

6.PROPAGATION_NEVER

??不能在事務(wù)中執(zhí)行。

如果ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED。 而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NEVER ,那么ServiceB.methodB就要拋出異常了。

7.PROPAGATION_NESTED

??如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。

Spring中事務(wù)的配置

配置文件的方式

<tx:advice id="txAdvice" transaction-manager="txManager"> 
  <tx:attributes> 
  <!--設(shè)置所有匹配的方法,然后設(shè)置傳播級(jí)別和事務(wù)隔離-->
   <tx:method name="save*" propagation="REQUIRED" /> 
   <tx:method name="add*" propagation="REQUIRED" /> 
   <tx:method name="create*" propagation="REQUIRED" /> 
   <tx:method name="insert*" propagation="REQUIRED" /> 
   <tx:method name="update*" propagation="REQUIRED" /> 
   <tx:method name="merge*" propagation="REQUIRED" /> 
   <tx:method name="del*" propagation="REQUIRED" /> 
   <tx:method name="remove*" propagation="REQUIRED" /> 
   <tx:method name="put*" propagation="REQUIRED" /> 
   <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> 
   <tx:method name="count*" propagation="SUPPORTS" read-only="true" /> 
   <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> 
   <tx:method name="list*" propagation="SUPPORTS" read-only="true" /> 
   <tx:method name="*" propagation="SUPPORTS" read-only="true" /> 
  </tx:attributes> 
</tx:advice>

注解的方式

<!--開(kāi)啟注解的方式--> 
<tx:annotation-driven transaction-manager="transactioManager" />

@Transactional(propagation=Propagation.REQUIRED)

如果有事務(wù), 那么加入事務(wù), 沒(méi)有的話新建一個(gè)(默認(rèn)情況下)

@Transactional(propagation=Propagation.NOT_SUPPORTED)

容器不為這個(gè)方法開(kāi)啟事務(wù)

@Transactional(propagation=Propagation.REQUIRES_NEW)

不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來(lái)的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)

@Transactional(propagation=Propagation.MANDATORY)

必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常

@Transactional(propagation=Propagation.NEVER)

必須在一個(gè)沒(méi)有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS)

如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒(méi)有聲明事務(wù),那就不用事務(wù).

以上是“Spring中事務(wù)傳播行為的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:Spring中事務(wù)傳播行為的示例分析
分享地址:http://muchs.cn/article2/gdisic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號(hào)、網(wǎng)站營(yíng)銷域名注冊(cè)、面包屑導(dǎo)航、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司