您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Spring Aop事務(wù)管理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Spring Aop事務(wù)管理是什么”吧!
同一個(gè)類中A方法調(diào)用B方法時(shí),如果在B方法上面設(shè)置事務(wù),B方法的事務(wù)不會(huì)生效,因?yàn)锳方法不是通過(guò)代理對(duì)象訪問(wèn)的,因此事務(wù)增強(qiáng)沒(méi)有生效。但需要注意的是,如果A方法上配置了事務(wù),A和B是一個(gè)事務(wù)管理器管理的,則B方法還是在A方法的事務(wù)上下文中執(zhí)行。
/**
* 外層方法沒(méi)有配置事務(wù),驗(yàn)證調(diào)用同類方法時(shí)的場(chǎng)景:
* 1、方法B配置事務(wù)、執(zhí)行數(shù)據(jù)庫(kù)操作后拋出異常,數(shù)據(jù)不會(huì)回滾:因?yàn)榉椒▋?nèi)調(diào)用事務(wù)沒(méi)生效
* 2、同上,通過(guò)代理對(duì)象訪問(wèn),事務(wù)回滾
*/
public void pureA_tranB_throw() {
// 沒(méi)有事務(wù),事務(wù)正常提交
db1Op();
// 1、不會(huì)回滾,因?yàn)榉椒▋?nèi)調(diào)用事務(wù)沒(méi)生效
//traB_throw();
// 2、通過(guò)代理對(duì)象,事務(wù)會(huì)回滾
C1Services c1Services = (C1Services) AopContext.currentProxy();
c1Services.traB_throw();
throw new RuntimeException("test rollback");
}
@Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
public void traB_throw() {
db1Op();
throw new RuntimeException("test rollback");
}
/**
* 外層方法配置事務(wù),驗(yàn)證調(diào)用同類方法時(shí)的場(chǎng)景:
* 1、方法B配置事務(wù)、執(zhí)行數(shù)據(jù)庫(kù)操作后拋出異常,雖然B方法未啟用事務(wù)的增強(qiáng),但和外層事務(wù)屬于同一個(gè)事務(wù)管理器,數(shù)據(jù)會(huì)回滾
*/
@Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
public void traA_traB_throw() {
// 有外層事務(wù),事務(wù)會(huì)回滾
db1Op();
// 1、會(huì)回滾,因?yàn)殡m然方法B的事務(wù)沒(méi)失效,但是外層屬于同一個(gè)事務(wù)管理器,因此外層事務(wù)會(huì)控制其回滾
traB_throw();
throw new RuntimeException("test rollback");
}
同一個(gè)類中A方法調(diào)用B2方法,A和B2的事務(wù)管理器不一樣,A方法上配置事務(wù),B2上配置事務(wù),B2執(zhí)行異常。如果是A方法直接調(diào)用B2方法,B2不會(huì)回滾,同上因?yàn)槭聞?wù)增強(qiáng)沒(méi)生效,但通過(guò)代理對(duì)象訪問(wèn)可以回滾。
/**
* 外層方法配置事務(wù),驗(yàn)證不同數(shù)據(jù)庫(kù)操作的場(chǎng)景:
* 1、不會(huì)回滾,B2方法的事務(wù)增強(qiáng)未生效,且B2和外層方法不是一個(gè)事務(wù)管理器,所以不會(huì)受外層事務(wù)影響
* 2、會(huì)回滾,B2方法的事務(wù)增強(qiáng)生效,執(zhí)行異常,事務(wù)回滾
*/
@Transactional(rollbackFor = RuntimeException.class, value = "db1transactionManager")
public void traA_traB2_throw() {
// 有事務(wù),事務(wù)會(huì)回滾
db1Op();
///1、不會(huì)回滾,事務(wù)增強(qiáng)沒(méi)生效
//traB2_throw();
// 通過(guò)代理對(duì)象,事務(wù)會(huì)回滾
C1Services c1Services = (C1Services) AopContext.currentProxy();
c1Services.traB2_throw();
throw new RuntimeException("test rollback");
}
@Transactional(rollbackFor = RuntimeException.class, value = "db2transactionManager")
public void traB2_throw() {
db2();
throw new RuntimeException("test rollback");
}
不同類中C1類的A方法調(diào)用C2類的B方法,通過(guò)類的實(shí)例對(duì)象調(diào)用B方法,如果B方法設(shè)置事務(wù),因?yàn)槭峭ㄟ^(guò)代理對(duì)象訪問(wèn),因此事務(wù)增強(qiáng)會(huì)生效。
事務(wù)的傳播行為有:
REQUIRED 支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則創(chuàng)建新事務(wù)。是spring事務(wù)管理的默認(rèn)隔離級(jí)別
SUPPORTS 支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則按照無(wú)事務(wù)運(yùn)行
MANDATORY 支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)不存在,則拋出異常
REQUIRES_NEW 創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前事務(wù)存在,則掛起當(dāng)前事務(wù)
NOT_SUPPORTED 按照無(wú)事務(wù)運(yùn)行,如果當(dāng)前事務(wù)存在,則掛起當(dāng)前事務(wù)
NEVER 按照無(wú)事務(wù)運(yùn)行,如果當(dāng)前事務(wù)存在,則拋出異常
NESTED 如果當(dāng)前事務(wù)存在,則按照嵌套事務(wù)的方式執(zhí)行,在特別的事務(wù)管理器上才會(huì)創(chuàng)建嵌套事務(wù),一些JTA的提供者支持嵌套事務(wù)管理器
到此,相信大家對(duì)“Spring Aop事務(wù)管理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。