如何在事務提交后才執行某個方法


如何在事務提交后才執行某個方法

開發過程中經常出現如下場景;
新增一篇文章,然后發一個廣播mq出去;
廣播監聽者監聽到消息然后根據文章id回查文章內容;
但是此時新增文章的方法的事務還沒有提交,根據id回查數據庫的時候查到數據為空。

代碼如下:

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

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

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

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

但是這樣每次涉及這樣的業務都需要包一層,而且很多時候並不知道調用add文章的外層是否還有@Transactional注解
我們希望達到的效果是注冊一個mq事件,等事務提交后再出發我們的mq事件

TransactionSynchronizationManager

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

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的方法就會在事務提交后才出發。這樣回查的時候就不會空了。

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


免責聲明!

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



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