真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring事務(wù)傳播行為是什么?怎么用

Spring事務(wù)傳播行為是什么?怎么用?其實(shí)這些困擾都可以總結(jié)成一個(gè)問題,即Spring事務(wù)傳播行為的實(shí)現(xiàn)方式,下面我們運(yùn)用實(shí)例來展示Spring事務(wù)傳播行為的實(shí)現(xiàn)方式。

成都創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十年品質(zhì),值得信賴!

假如有兩個(gè)方法A和B,A調(diào)用B,這兩個(gè)方法上都加了事物,究竟使用哪個(gè)事物?

Public void A(){

          B();

}

這就是spring事物傳播行為要解決的問題。 

在spring中有七種事務(wù)傳播行為。

簡(jiǎn)單介紹一下這七種方式(如果不懂不用糾結(jié),后面詳細(xì)介紹)

常用:

REQUIRED:如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),如果已經(jīng)存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中,一般的選擇(默認(rèn)值)
REQUIRES_NEW : 新建事務(wù),如果當(dāng)前在事務(wù)中,把當(dāng)前事務(wù)掛起。
不常用:
SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行(沒有事務(wù))
MANDATORY:使用當(dāng)前的事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常
NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起
NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),拋出異常
NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行 REQUIRED類似的操作。
我們重點(diǎn)介紹一下常用的兩種:

一:REQUIRED

方法B用REQUIRED修飾,方法A調(diào)用方法B,如果方法A當(dāng)前沒有事務(wù),方法B就新建一個(gè)事務(wù),如果方法A有事務(wù),方法B就加入到這個(gè)事務(wù)中。一般的選擇(默認(rèn)值)

 

下面來看一個(gè)轉(zhuǎn)賬的例子:

數(shù)據(jù)訪問層:

@Repository("accountDao")
public class AccountDaoImpl{
updateAccount(Account account) {
     jdbcTemplate.update(,account.getMoney(),account.getId());
 }
}
業(yè)務(wù)邏輯層:
@Service("accountService")
public class AccountServiceImpl{
@Transactional(propagation=Propagation.REQUIRED)
transfer(Account source, Account target, Float money) {
         source.setMoney(source.getMoney()-money);target.setMoney(target.getMoney()+money);.updateAccount(source);
         .updateAccount(target);
 }
@Transactional(propagation=Propagation.REQUIRED)
transferException(Account source, Account target, Float money) {
         source.setMoney(source.getMoney()-money);target.setMoney(target.getMoney()+money);.updateAccount(source);
         i=1/0;
         .updateAccount(target);
 }
 
}
 
測(cè)試:
@Test
 public voidtestDo(){
     serviceImpl.transfer("%張%","%李%",1000f);
serviceImpl.transferException ("%張%","%李%",2000f);
int I = 1/0;
 }
現(xiàn)在測(cè)試的方法testDo上沒有加事務(wù),當(dāng)它調(diào)用serviceImpl.transfer()方法的時(shí)候,因?yàn)閠ransfer使用REQUIRED修飾,所以transfer會(huì)新建一個(gè)事務(wù),自己獨(dú)立在該事務(wù)執(zhí)行,成功轉(zhuǎn)賬1000,張三賬戶1000,李四4000。當(dāng)調(diào)用serviceImpl.transferException時(shí)新建事務(wù),在執(zhí)行該方法時(shí)發(fā)生異常,事務(wù)回滾,所以轉(zhuǎn)賬不成功,張三賬戶1000,李四4000,此時(shí)這兩個(gè)方法都是在自己的事務(wù)中獨(dú)立執(zhí)行。

現(xiàn)在把testDo方法上也加上事務(wù)

再來測(cè)試一下:

@Test
 public voidtestDo(){
     serviceImpl.transfer("%張%","%李%",1000f);
serviceImpl.transferException ("%張%","%李%",2000f);
}

當(dāng)它調(diào)用serviceImpl.transfer()方法的時(shí)候transfer方法和transferException方法加入到testDo方法的事務(wù)中,他們都在一個(gè)事務(wù),當(dāng)發(fā)生異常的時(shí)候事務(wù)回滾,轉(zhuǎn)賬1000和2000都不成功,張三賬戶2000,李四3000。

 

二:REQUIRES_NEW:

方法B用REQUIRES_NEW修飾,方法A調(diào)用方法B,不管方法A上有沒有事務(wù)方法B都新建一個(gè)事務(wù),在該事務(wù)執(zhí)行。

測(cè)試:
@Test
 public voidtestDo(){
     serviceImpl.transfer("%張%","%李%",1000f);
serviceImpl.transferException ("%張%","%李%",2000f);
int I = 1/0;
 }

不管testDo方法上有沒有事務(wù),“serviceImpl.transfer”方法和“serviceImpl.transferException”方法都會(huì)新建事務(wù),獨(dú)立在各自的事務(wù)中執(zhí)行,互不影響,所以轉(zhuǎn)賬1000成功,轉(zhuǎn)賬2000失敗。結(jié)果是:張三賬戶1000,李四4000

關(guān)于Spring事務(wù)傳播行為的實(shí)現(xiàn)方式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。


標(biāo)題名稱:Spring事務(wù)傳播行為是什么?怎么用
當(dāng)前路徑:http://weahome.cn/article/pioecd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部