亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問(wèn)題

 更新時(shí)間:2021年10月31日 09:07:32   作者:weixin_33976072  
這篇文章主要介紹了Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問(wèn)題,本文給大家分享問(wèn)題原因及解決辦法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
  • PROPAGATION_REQUIRED: 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù)則開(kāi)啟事務(wù);
  • PROPAGATION_REQUIRES_NEW:總是開(kāi)啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起;

問(wèn)題:

Spring中一個(gè)沒(méi)有事務(wù)的方法A調(diào)用一個(gè)默認(rèn)事務(wù)(PROPAGATION_REQUIRED)的方法B時(shí),如果使用this調(diào)用方法B,方法B拋出RuntimeException,此時(shí)方法B事務(wù)未生效,不會(huì)回滾。

@Service
public class EmployeeService {
 
    @Autowired
    private EmployeeDao employeeDao;
 
    public void save(){
        try {        
            this.saveEmployee();  //此處this調(diào)用不會(huì)開(kāi)啟事務(wù),數(shù)據(jù)會(huì)被保存
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    @Transactional(propagation = Propagation.PROPAGATION_REQUIRED)
    //此處無(wú)論是PROPAGATION_REQUIRED還是PROPAGATION_REQUIRES_NEW,事務(wù)均不生效
    public void saveEmployee(){
        Employee employee = new Employee();
        employee.setName("zhangsan");
        employee.setAge("26";
        employeeDao.save(employee);
        throw new RuntimeException();
    }
}

問(wèn)題原因:

JDK的動(dòng)態(tài)代理。只有被動(dòng)態(tài)代理直接調(diào)用時(shí)才會(huì)產(chǎn)生事務(wù)。在SpringIoC容器中返回的調(diào)用的對(duì)象是代理對(duì)象而不是真實(shí)的對(duì)象。而這里的this是EmployeeService真實(shí)對(duì)象而不是代理對(duì)象。

解決辦法:

方法1、在方法A上開(kāi)啟事務(wù),方法B不用事務(wù)或默認(rèn)事務(wù),并在方法A的catch中throw new RuntimeException();(在沒(méi)指定rollbackFor時(shí),默認(rèn)回滾的異常為RuntimeException),這樣使用的就是方法A的事務(wù)。(一定要throw new RuntimeException();否則異常被捕捉處理,同樣不會(huì)回滾。)如下:

@Transactional() //開(kāi)啟事務(wù)
public void save(){
    try {        
        this.saveEmployee();  //這里this調(diào)用會(huì)使事務(wù)失效,數(shù)據(jù)會(huì)被保存
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException();
    }
}

方法2、方法A上可以不開(kāi)啟事務(wù),方法B上開(kāi)啟事務(wù),并在方法A中將this調(diào)用改成動(dòng)態(tài)代理調(diào)用(AopContext.currentProxy()),如下:

public void save(){
    try {        
        EmployeeService proxy =(EmployeeService) AopContext.currentProxy();
        proxy.saveEmployee();
    }catch (Exception e){
        e.printStackTrace();
    }
}

到此這篇關(guān)于spring事務(wù)調(diào)用失效問(wèn)題的文章就介紹到這了,更多相關(guān)spring事務(wù)調(diào)用失效問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 下數(shù)據(jù)業(yè)務(wù)邏輯開(kāi)發(fā)技術(shù) JOOQ 和 SPL

    Java 下數(shù)據(jù)業(yè)務(wù)邏輯開(kāi)發(fā)技術(shù) JOOQ 和 SPL

    這篇文章主要為大家介紹了Java 下數(shù)據(jù)業(yè)務(wù)邏輯開(kāi)發(fā)技術(shù) JOOQ 和 SPL詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • java中的各種修飾符作用及范圍

    java中的各種修飾符作用及范圍

    這篇文章主要介紹了java中的各種修飾符作用及范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(21)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(21)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • 用java實(shí)現(xiàn)的獲取優(yōu)酷等視頻縮略圖的實(shí)現(xiàn)代碼

    用java實(shí)現(xiàn)的獲取優(yōu)酷等視頻縮略圖的實(shí)現(xiàn)代碼

    想獲取優(yōu)酷等視頻縮略圖,在網(wǎng)上沒(méi)有找到滿(mǎn)意的資料,參考了huangdijia的PHP版工具一些思路,寫(xiě)了下面的JAVA版代碼。。其實(shí)也可以做成JS版的
    2013-05-05
  • 基于Java事件監(jiān)聽(tīng)編寫(xiě)一個(gè)中秋猜燈謎小游戲

    基于Java事件監(jiān)聽(tīng)編寫(xiě)一個(gè)中秋猜燈謎小游戲

    眾所周知,JavaSwing是Java中關(guān)于窗口開(kāi)發(fā)的一個(gè)工具包,可以開(kāi)發(fā)一些窗口程序,然后由于工具包的一些限制,導(dǎo)致Java在窗口開(kāi)發(fā)商并沒(méi)有太多優(yōu)勢(shì),不過(guò),在JavaSwing中關(guān)于事件的監(jiān)聽(tīng)機(jī)制是我們需要重點(diǎn)掌握的內(nèi)容,本文將基于Java事件監(jiān)聽(tīng)編寫(xiě)一個(gè)中秋猜燈謎小游戲
    2023-09-09
  • Java RandomAccessFile基本文件操作示例

    Java RandomAccessFile基本文件操作示例

    這篇文章主要介紹了Java RandomAccessFile基本文件操作,結(jié)合實(shí)例形式分析了Java基于RandomAccessFile實(shí)現(xiàn)文件讀寫(xiě)及文件隨機(jī)訪(fǎng)問(wèn)相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • java基礎(chǔ)的詳細(xì)了解第二天

    java基礎(chǔ)的詳細(xì)了解第二天

    這篇文章對(duì)Java編程語(yǔ)言的基礎(chǔ)知識(shí)作了一個(gè)較為全面的匯總,在這里給大家分享一下。需要的朋友可以參考,希望能給你帶來(lái)幫助
    2021-08-08
  • 5個(gè)JAVA入門(mén)必看的經(jīng)典實(shí)例

    5個(gè)JAVA入門(mén)必看的經(jīng)典實(shí)例

    這篇文章主要為大家詳細(xì)介紹了5個(gè)JAVA入門(mén)必看的經(jīng)典實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 部署springboot項(xiàng)目到云服務(wù)器的兩種方式(jar+war)

    部署springboot項(xiàng)目到云服務(wù)器的兩種方式(jar+war)

    本文主要介紹了部署springboot項(xiàng)目到云服務(wù)器的兩種方式,主要介紹了jar和war兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java中Semaphore(信號(hào)量)的使用方法

    Java中Semaphore(信號(hào)量)的使用方法

    這篇文章主要介紹了Java中Semaphore(信號(hào)量)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論