Spring事務(wù)傳播行為問(wèn)題解決
這篇文章主要介紹了Spring事務(wù)傳播行為問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
一、簡(jiǎn)介
Spring事務(wù)配置及相關(guān)說(shuō)明詳見(jiàn):http://www.dhdzp.com/article/177710.htm。這里說(shuō)明spring事務(wù)的幾點(diǎn)注意:
1、默認(rèn)只會(huì)檢查回滾RuntimeException的異常。
2、@Transactional注解只能作用于public的方法上,默認(rèn)傳播行為 Propagation.REQUIRED
3、service內(nèi)部方法之間的調(diào)用,不會(huì)被spring攔截到,也即不會(huì)產(chǎn)生事務(wù)
二、坑點(diǎn)
主要的坑點(diǎn)就是在嵌套事務(wù)上,當(dāng)service內(nèi)部方法之間調(diào)用的時(shí)候,很可能會(huì)產(chǎn)生預(yù)期之外的效果。例如下例子:
saveUser保存用戶,如果過(guò)程出現(xiàn)異常,則執(zhí)行saveMsg方法。
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Autowired
private MsgDao msgDao;
@Autowired
private MsgService msgService;
@Autowired
private UserService userService;
@Transactional(propagation = Propagation.REQUIRED)
public void saveUser(User user) throws Exception {
System.out.println(user.toString());
try {
userDao.saveUser(user);
int i = 1/0;
// saveUser2(user);
} catch (Exception e) {
// msgService.saveMsg();
// this.saveMsg();
userService.saveMsg();
throw new RuntimeException();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveMsg() {
TbMsg msg = TbMsg.builder().name("xiaocao").msg("xiaoxiao").age(27).build();
msgDao.saveMsg(msg);
}
}
單元測(cè)試,調(diào)用saveUser方法,并沒(méi)有達(dá)到想要的效果(saveUser異常,SaveMsg隔離級(jí)別是REQUIRES_NEW,理論上應(yīng)該能入庫(kù))。
失敗原因即是上面第一節(jié)中說(shuō)的:同一個(gè)service中的方法調(diào)用,不會(huì)產(chǎn)生新事務(wù)。Spring 事務(wù)的管理控制,主要是通過(guò)AOP的動(dòng)態(tài)代理增強(qiáng)來(lái)實(shí)現(xiàn)的,目標(biāo)對(duì)象本身并沒(méi)有任何的事務(wù)管理能力,都是通過(guò)代理對(duì)象動(dòng)態(tài)增強(qiáng)功能去實(shí)現(xiàn)事務(wù)管理。在同一個(gè)service中的方法調(diào)用,相當(dāng)于是目標(biāo)對(duì)象本身的this調(diào)用,并沒(méi)有經(jīng)過(guò)代理對(duì)象,所以自然的事務(wù)配置的嵌套均無(wú)效。
解決策略:
1、saveMsg移動(dòng)到另一個(gè)service中,在UserServiceImpl中導(dǎo)入MsgService,saveUser中通過(guò)MsgService類(lèi)去調(diào)用。
2、UserServiceImpl中注入自己,通過(guò)注入的自身service進(jìn)行調(diào)用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql字段和java實(shí)體類(lèi)屬性類(lèi)型匹配方式
這篇文章主要介紹了Mysql字段和java實(shí)體類(lèi)屬性類(lèi)型匹配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Mybatis的TypeHandler加解密數(shù)據(jù)實(shí)現(xiàn)
在我們數(shù)據(jù)庫(kù)中有些時(shí)候會(huì)保存一些用戶的敏感信息,所以就需要對(duì)這些數(shù)據(jù)進(jìn)行加密,那么本文就介紹了Mybatis的TypeHandler加解密數(shù)據(jù)實(shí)現(xiàn),感興趣的可以了解一下2021-06-06
詳解Spring Cloud中Hystrix 線程隔離導(dǎo)致ThreadLocal數(shù)據(jù)丟失
這篇文章主要介紹了詳解Spring Cloud中Hystrix 線程隔離導(dǎo)致ThreadLocal數(shù)據(jù)丟失,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
JAVA中實(shí)現(xiàn)鏈?zhǔn)讲僮鳎ǚ椒ㄦ湥┑暮?jiǎn)單例子
這篇文章主要介紹了JAVA中實(shí)現(xiàn)鏈?zhǔn)讲僮鞯睦?模仿jQuery的方法鏈實(shí)現(xiàn),需要的朋友可以參考下2014-04-04
spring?kafka?@KafkaListener詳解與使用過(guò)程
這篇文章主要介紹了spring-kafka?@KafkaListener詳解與使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Java編程數(shù)組中最大子矩陣簡(jiǎn)便解法實(shí)現(xiàn)代碼
這篇文章主要介紹了Java編程數(shù)組中最大子矩陣簡(jiǎn)便解法實(shí)現(xiàn)代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能
不知道小伙伴們?cè)陧?xiàng)目中有沒(méi)有遇到過(guò)導(dǎo)出 PDF 的需求,小編在之前的 tienchin 項(xiàng)目中有一個(gè)合同導(dǎo)出的功能,需要將文檔導(dǎo)出為PDF,將文檔導(dǎo)出為 PDF 有很多方案,不同方案的優(yōu)缺點(diǎn)也各不相同,今天小編就和大家演示一個(gè),感興趣的小伙伴跟著小編一起來(lái)看看吧2024-10-10

