如何在事務(wù)提交后才執(zhí)行某個方法

如何在事務(wù)提交后才執(zhí)行某個方法

開發(fā)過程中經(jīng)常出現(xiàn)如下場景;
新增一篇文章,然后發(fā)一個廣播mq出去;
廣播監(jiān)聽者監(jiān)聽到消息然后根據(jù)文章id回查文章內(nèi)容;
但是此時新增文章的方法的事務(wù)還沒有提交,根據(jù)id回查數(shù)據(jù)庫的時候查到數(shù)據(jù)為空。

代碼如下:

@Transactional
    public void add文章() {
        //insert文章
        //sendmq
    }

此時我們希望的效果是,等事務(wù)提交之后再發(fā)mq。
可以改成如下寫法:

 public void add文章() {
        //insert文章

        //sendmq
    }
    
    @Transactional
    public void insert文章() {
        //insert文章
    }

但是這樣每次涉及這樣的業(yè)務(wù)都需要包一層,而且很多時候并不知道調(diào)用add文章的外層是否還有@Transactional注解
我們希望達(dá)到的效果是注冊一個mq事件,等事務(wù)提交后再出發(fā)我們的mq事件。

TransactionSynchronizationManager

嵌入如下代碼,可以注冊一個事務(wù)事件,在事務(wù)提交之后才出發(fā)我的方法。

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            System.out.println("a");
        }
});

總的寫法如下:

@Transactional
public void add文章() {
    //insert文章
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
               //sendmq
            }
    });
   
}

這樣mq的方法就會在事務(wù)提交后才出發(fā)。這樣回查的時候就不會空了。

注意,如果是讀寫分離的數(shù)據(jù)庫數(shù)據(jù)同步的延時,該方法不能解決,還是會查到空值。此時就要用延時隊列的辦法解決問題。

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

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