您好,登錄后才能下訂單哦!
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事務傳播行為的實現方式就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。