亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

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

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

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

Public void A(){

          B();

}

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

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

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

常用:

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

一:REQUIRED

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

 

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

數據訪問層:

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

現在把testDo方法上也加上事務

再來測試一下:

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

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

 

二:REQUIRES_NEW

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

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

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

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

向AI問一下細節

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

AI

洞口县| 西昌市| 绥江县| 岳阳县| 乌苏市| 酉阳| 阿克| 永康市| 太仓市| 鄱阳县| 晋城| 通海县| 凌云县| 厦门市| 调兵山市| 曲靖市| 泰安市| 杨浦区| 门源| 五莲县| 庆阳市| 娱乐| 阳城县| 瑞昌市| 太湖县| 临安市| 无锡市| 中宁县| 贡觉县| 扶沟县| 锡林浩特市| 藁城市| 山西省| 洪雅县| 咸宁市| 石狮市| 泊头市| 蕉岭县| 兴海县| 乐平市| 安乡县|