spring boot shiro 事務(wù)無(wú)效

今天在項(xiàng)目想測(cè)試一下事務(wù)回滾是否生效,還好心血來潮祷舀,突然發(fā)現(xiàn)數(shù)據(jù)無(wú)法回滾,問題很嚴(yán)重啊C镳小夺克!!
這是我的測(cè)試代碼

   @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(MerchantUpdateDTO condition) throws CustomException {
        // 查詢待更新的商戶
        Merchant updateMerchant = merchantMapper.selectById(condition.getId());
        if (updateMerchant == null) {
            throw new CustomException("編輯的商戶不存在");
        }

        // 更新商戶信息
        BeanUtils.copyProperties(condition, updateMerchant);
        updateMerchant.setAccountStatus(AccountStatus.PENDING_REVIEW);
        merchantMapper.updateById(updateMerchant);
        throw new CustomException("編輯的商戶不存在");
    }

一開始我懷疑是網(wǎng)上常見的幾種
1、檢查數(shù)據(jù)庫(kù)的引擎是否是innoDB
2嚎朽、啟動(dòng)類上是否加入@EnableTransactionManagement注解
3铺纽、是否在方法上加入@Transactional注解或Service的類上是否有@Transactional注解
4、方法是否為public
5哟忍、是否是因?yàn)閽伋隽薊xception等checked異常

檢查過后我發(fā)現(xiàn)都沒問題的狡门,這時(shí)候我就嘗試放到新建的類中測(cè)試,發(fā)現(xiàn)居然可以了锅很。
為啥舊的類不行呢其馏,有啥區(qū)別呢
我這邊檢查到舊的類是注入到shiro Realm的
接著我去網(wǎng)上了解相關(guān)信息

錯(cuò)誤原因:

Spring中事務(wù)是通過AOP創(chuàng)建代理對(duì)象來完成的,有BeanFactoryTransactionAttributeSourceAdvisor完成對(duì)需要事務(wù)的方法織入對(duì)事務(wù)的處理爆安。完成創(chuàng)建AOP代理對(duì)象的功能由一個(gè)特殊的BeanPostProcessor完成--AnnotationAwareAspectJAutoProxyCreator叛复。該類實(shí)現(xiàn)了BeanPostProcessor接口,在bean創(chuàng)建完成并將屬性設(shè)置好之后扔仓,攔截bean褐奥,并創(chuàng)建代理對(duì)象,在原對(duì)象的方法功能上添加增強(qiáng)器中增強(qiáng)方法的處理翘簇。對(duì)于事務(wù)增強(qiáng)器BeanFactoryTransactionAttributeSourceAdvisor而言撬码,也就是在原有方法上加入事務(wù)的功能。

但是版保,在ApplicationContext刷新上下文過程(refresh)中呜笑,上下文會(huì)調(diào)用registerBeanPostProcessors方法將BeanFactory中的所有BeanPostProcessor后處理器注冊(cè)到BeanFactory中,使其后面流程中創(chuàng)建bean的時(shí)候生效

由于ShiroFilterFactoryBean實(shí)現(xiàn)了FactoryBean接口彻犁,所以它會(huì)提前被初始化叫胁。又因?yàn)镾ecurityManager,SecurityManager依賴于Realm實(shí)現(xiàn)類汞幢、Realm實(shí)現(xiàn)類又依賴于MerchantService驼鹅,所以引發(fā)所有相關(guān)的bean提前初始化。

ShiroFilterFactoryBean -> SecurityManager -> Realm實(shí)現(xiàn)類 -> MerchantService

但是此時(shí)還只是ApplicationContext中registerBeanPostProcessors注冊(cè)BeanPostProcessor處理器的階段急鳄,此時(shí)AnnotationAwareAspectJAutoProxyCreator還沒有注冊(cè)到BeanFactory中谤民,MerchantService無(wú)法享受到事務(wù)處理!

解決辦法:

1疾宏、在Realm實(shí)現(xiàn)中使用Mapper张足,而不是直接使用Service對(duì)象。缺點(diǎn):直接和數(shù)據(jù)庫(kù)交互坎藐,并且也沒有Service中的邏輯交互以及緩存
2为牍、在Realm中Service聲明上加入@Lazy注解哼绑,延遲Realm實(shí)現(xiàn)中Service對(duì)象的初始化時(shí)間,這樣就可以保證Service實(shí)際初始化的時(shí)候會(huì)被BeanPostProcessor攔截碉咆,創(chuàng)建具有事務(wù)功能的代理對(duì)象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抖韩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疫铜,更是在濱河造成了極大的恐慌茂浮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳咕,死亡現(xiàn)場(chǎng)離奇詭異席揽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谓厘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門幌羞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竟稳,你說我怎么就攤上這事属桦。” “怎么了他爸?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵聂宾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我讲逛,道長(zhǎng)亏吝,這世上最難降的妖魔是什么岭埠? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任盏混,我火速辦了婚禮,結(jié)果婚禮上惜论,老公的妹妹穿的比我還像新娘许赃。我一直安慰自己,他們只是感情好馆类,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布混聊。 她就那樣靜靜地躺著,像睡著了一般乾巧。 火紅的嫁衣襯著肌膚如雪句喜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天沟于,我揣著相機(jī)與錄音咳胃,去河邊找鬼。 笑死旷太,一個(gè)胖子當(dāng)著我的面吹牛展懈,可吹牛的內(nèi)容都是我干的销睁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼存崖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冻记!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起来惧,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冗栗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后供搀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞瞒,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年趁曼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了军浆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挡闰,死狀恐怖乒融,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摄悯,我是刑警寧澤赞季,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奢驯,受9級(jí)特大地震影響申钩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘪阁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一撒遣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧管跺,春花似錦义黎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至艇拍,卻和暖如春狐蜕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卸夕。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工层释, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娇哆。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓湃累,卻偏偏與公主長(zhǎng)得像勃救,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子治力,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容