事務(wù)

  1. https://blog.csdn.net/weixin_44771989/article/details/123967275
異常類型

Exception 有checked和uncheck:
RuntimeException
IOException

throw 和 throws

事務(wù)和異常的關(guān)系

默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的RuntimeException時(shí)才回滾。
springaop 異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進(jìn)行回滾,默認(rèn)情況下aop只捕獲RuntimeException的異常,但可以通過配置來捕獲特定的異常并回滾;

如果發(fā)生異常,那么產(chǎn)生回滾
如果將出錯(cuò)的方法或者SQL try catch 不回滾
如果調(diào)用該方法的方法 不 try catch 則會(huì)被該方法拋出的異常影響 可能導(dǎo)致回滾

新建一個(gè)事務(wù),當(dāng)前事務(wù)存在,把當(dāng)前事務(wù)掛起
updateSchool方法更新id為1的name為“湖南大學(xué)”,location為“湖南”,有事務(wù),打印1/0,報(bào)錯(cuò);

    @Transactional
    public void updateSchool(){
        School school = new School();
        school.setId(1);
        school.setName("湖南大學(xué)");
        school.setLocation("湖南");
        schoolMapper.updateByPrimaryKeySelective(school);
        studentService.updateStudent();
        System.out.println(1/0);
    }

updateStudent方法更新id為1的age為25,事務(wù)傳播機(jī)制為REQUIRES_NEW;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateStudent(){
        Student student = new Student();
        student.setSid(1);
        student.setAge(25);
        studentMapper.updateByPrimaryKeySelective(student);
    }

如上所示:updateSchool方法有加事務(wù),studentService.updateStudent方法加了事務(wù),而且傳播機(jī)制是REQUIRES_NEW,如果updateStudent方法新建了另一個(gè)事務(wù),updateSchool報(bào)錯(cuò),updateStudent不會(huì)回滾,如果不是新建一個(gè)事務(wù)而是共用一個(gè)事務(wù),就會(huì)一起回滾;
————————————————
使用場景:被調(diào)用方法,不想因?yàn)檎{(diào)用方出錯(cuò)而回滾,可以使用REQUIRES_NEW;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容