在線程池中的使用spring aop事務增強


問題描述:

在項目里使用了線程池運行同一個類的實例方法,代碼大致如下,運行時發現job方法的事務不生效

    @Transactional
    public void doJob() {
        EXECOTOR.execute(() ->job());
    }

    @Transactional
    public void job(){
    //db operation  
    }

原因分析:

debug進入job方法時,發現運行job方法的實例是個普通實例而不是個代理對象,因此無法實現aop增強

解決辦法:

在doJob中調用AopContext.currentProxy()獲取當前的代理對象,在代理對象上調用job方法

    @Transactional
    public void doJob() {
        AAAService proxy = (AAAService) AopContext.currentProxy();
        EXECOTOR.execute(() ->proxy.job());
    }

    @Transactional
    public void job(){
    //db operation  
    }    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM