溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring事務傳播行為是什么?怎么用

發(fā)布時間:2020-06-03 14:12:03 來源:億速云 閱讀:418 作者:Leah 欄目:編程語言

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

假如有兩個方法A和B,A調用B,這兩個方法上都加了事物,究竟使用哪個事物?

Public void A(){

          B();

}

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

在spring中有七種事務傳播行為。

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

常用:

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

一:REQUIRED

方法B用REQUIRED修飾,方法A調用方法B,如果方法A當前沒有事務,方法B就新建一個事務,如果方法A有事務,方法B就加入到這個事務中。一般的選擇(默認值)

 

下面來看一個轉賬的例子:

數據訪問層:

@Repository("accountDao")
public class AccountDaoImpl{
updateAccount(Account account) {
     jdbcTemplate.update(,account.getMoney(),account.getId());
 }
}
業(yè)務邏輯層:
@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);
 }
 
}
 
測試:
@Test
 public voidtestDo(){
     serviceImpl.transfer("%張%","%李%",1000f);
serviceImpl.transferException ("%張%","%李%",2000f);
int I = 1/0;
 }
現(xiàn)在測試的方法testDo上沒有加事務,當它調用serviceImpl.transfer()方法的時候,因為transfer使用REQUIRED修飾,所以transfer會新建一個事務,自己獨立在該事務執(zhí)行,成功轉賬1000,張三賬戶1000,李四4000。當調用serviceImpl.transferException時新建事務,在執(zhí)行該方法時發(fā)生異常,事務回滾,所以轉賬不成功,張三賬戶1000,李四4000,此時這兩個方法都是在自己的事務中獨立執(zhí)行。

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

再來測試一下:

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

當它調用serviceImpl.transfer()方法的時候transfer方法和transferException方法加入到testDo方法的事務中,他們都在一個事務,當發(fā)生異常的時候事務回滾,轉賬1000和2000都不成功,張三賬戶2000,李四3000。

 

二:REQUIRES_NEW

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

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

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

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

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI