怎么自己的電腦做網(wǎng)站服務(wù)器核心關(guān)鍵詞和長(zhǎng)尾關(guān)鍵詞
Spring事務(wù)大部分都是通過AOP實(shí)現(xiàn)的,所以事務(wù)失效的場(chǎng)景大部分都是因?yàn)锳OP失效,AOP基于動(dòng)態(tài)代理實(shí)現(xiàn)的
1.方法沒有被public修飾
原因:Spring會(huì)為方法創(chuàng)建代理、AOP添加事務(wù)通知前提條件是該方法時(shí)public的。
2.類沒有被Spring容器所托管
Spring沒有辦法給類生成動(dòng)態(tài)代理
3.不正確的異常捕獲
原因:事務(wù)通知只有捉到了目標(biāo)拋出的異常,才能進(jìn)行后續(xù)的回滾,如果目標(biāo)自己處理異常,事務(wù)通知AOP無(wú)法捕捉到異常,不會(huì)進(jìn)行回滾,事務(wù)失效。
4.在同一個(gè)類中的方法調(diào)用
a方法調(diào)用了當(dāng)前對(duì)象中的b方法,沒有調(diào)用代理對(duì)象的b方法
5.事務(wù)傳播性設(shè)置有誤
Spring有7種事務(wù)傳播特性,其意義是確定多個(gè)具有事務(wù)控制的service相互調(diào)用時(shí)所形成的的事務(wù)邊界,下表列出Spring的7種事務(wù)傳播特性以及含義
傳播特性 | 含義 |
---|---|
REQUIRED | Spring中默認(rèn)的事務(wù)傳播特效,表示必須存在事務(wù),如果外層方法存在事務(wù),則用外層方法的事務(wù),否則開啟一個(gè)新的事務(wù) |
REQUIRES_NEW | 當(dāng)前方法會(huì)開啟一個(gè)新事物,如果外層方法存在事務(wù),則會(huì)將外層方法的事務(wù)掛起,直到當(dāng)前方法的事務(wù)提交或回滾才會(huì)恢復(fù)執(zhí)行 |
SUPPORTS | 可以不存在事務(wù),如果有事務(wù)則使用當(dāng)前事務(wù),沒有則作為一個(gè)普通方法運(yùn)行 |
NOT_SUPPORTED | 不會(huì)存在事務(wù),如果外層方法有事務(wù),則會(huì)掛起 |
MANDATORY | 強(qiáng)制事務(wù)執(zhí)行,如果沒有事務(wù)則拋異常 |
NEVER | 強(qiáng)制非事務(wù)執(zhí)行,有事務(wù)就拋異常 |
NESTED | 如果外層方法存在事務(wù),則創(chuàng)建一個(gè)保存點(diǎn),如果當(dāng)前方法沒有異常,則統(tǒng)一到外層事務(wù)中提交,如果當(dāng)前方法存在異常,則外層事務(wù)也會(huì)回滾,如果外層事務(wù)出現(xiàn)異常,只會(huì)回滾外層事務(wù),當(dāng)前方法不會(huì)回滾 |
6.rollback-for配置有誤,通常是runtimeException需要回滾
7.沒有配置事務(wù)管理器
默認(rèn)自動(dòng)配置,SSM項(xiàng)目中需要手動(dòng)配置
8.數(shù)據(jù)庫(kù)不支持事務(wù)
如果使用的數(shù)據(jù)庫(kù)為MySQL,并且選用了MyISAM存儲(chǔ)引擎,則Spring的事務(wù)就會(huì)失效。