一寡夹、事務(wù)失效場(chǎng)景之一
非事務(wù)方法A中調(diào)用的自身類(lèi)的事務(wù)方法B
在方法A中秕噪,我們處理了不同的任務(wù)牍蜂,比如:①我們處理了網(wǎng)絡(luò)傳輸相關(guān)的功能涉瘾,上傳視頻、圖片到服務(wù)器等 ②向數(shù)據(jù)庫(kù)插入數(shù)據(jù)捷兰。這時(shí)立叛,我們會(huì)想到在方法上加@Transactional注解,但是贡茅,由于上傳視頻等可能會(huì)用時(shí)很長(zhǎng)秘蛇。
因此,我們會(huì)將@Transactional注解添加到插入數(shù)據(jù)庫(kù)相關(guān)的方法上(將其從方法中抽取出來(lái)顶考,叫方法B)赁还,這時(shí)再在A(yíng)中調(diào)用B,此時(shí)驹沿,如果B中發(fā)生異常艘策,我們會(huì)發(fā)現(xiàn),數(shù)據(jù)已經(jīng)插入數(shù)據(jù)庫(kù)了渊季,事務(wù)失效了朋蔫。
二罚渐、分析
因?yàn)槭聞?wù)起作用需要滿(mǎn)足兩個(gè)條件:①代理對(duì)象中調(diào)用方法②方法上加@Transactional注解。
上面A中調(diào)用B實(shí)際上是this調(diào)用驯妄,不是代理對(duì)象調(diào)用(注入的對(duì)象才叫代理對(duì)象)荷并,所以事務(wù)失效
三、解決方案
在類(lèi)中自己注入自己青扔,然后在A(yíng)中用這個(gè)代理對(duì)象去調(diào)用B源织,還需要將B添加到service接口中,這樣代理對(duì)象才能調(diào)用
image.png
image.png