您的位置:首頁 > 軟件教程 > 教程 > Spring事務操作后執(zhí)行代碼的解決方案

Spring事務操作后執(zhí)行代碼的解決方案

來源:好特整理 | 時間:2024-10-19 10:13:29 | 閱讀:122 |  標簽: Ri S in 代碼   | 分享到:

如果想在spring操作事務結束后執(zhí)行一些代碼,應該怎么辦? 為什么要這樣?比如我們在事務中給其他系統(tǒng)發(fā)了消息,期望事務提交后過一會收到這個系統(tǒng)的回應,然后操作剛剛提交的數(shù)據(jù)。但是如果回應來的太快就像龍卷風,我們的事務是托管給Spring的可能還沒提交,也就沒法操作了 一個方案是使用 Applica

在Spring中,如果需要在事務操作結束后執(zhí)行一些代碼,可以采取哪些方法呢?

為什么需要這樣做呢?比如,在事務中向其他系統(tǒng)發(fā)送消息,希望在事務提交后一段時間內收到該系統(tǒng)的響應,然后對剛剛提交的數(shù)據(jù)進行操作。但是如果響應太快,就像龍卷風一樣,我們的事務可能還沒有提交,這樣就無法進行操作。

一種解決方案是使用 ApplicationEventPublisher ,可以參考之前的博客:
https://www.iteye.com/blog/somefuture-2405963

博客訪問量超過100萬,我們假設總訪問量是10倍哈哈

Spring事務操作后執(zhí)行代碼的解決方案

這個API是Spring 1就提供的。從Spring 5開始,提供了一個新的事務相關的API,叫 TransactionSynchronization 事務同步機制。

上代碼

首先編寫一個Bean實現(xiàn) TransactionSynchronization 接口

import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.stereotype.Component;

@Component
public class AfterTransactionCommitExecutor implements TransactionSynchronization {

    @Override
    public void afterCommit() {
        // 事務提交后執(zhí)行的操作
        System.out.println("事務已提交,執(zhí)行后續(xù)操作");
    }

    // 其他需要重寫的方法...

    public void registerSynchronization() {
        // 注冊當前實例到事務同步管理器
        TransactionSynchronizationManager.registerSynchronization(this);
    }
}

然后,在服務層或者合適的地方調用 registerSynchronization() 方法來注冊事務同步回調

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class SomeService {

    @Autowired
    private AfterTransactionCommitExecutor afterTransactionCommitExecutor;

    @Transactional
    public void doWork() {
        // 業(yè)務邏輯...

        // 注冊事務同步回調
        afterTransactionCommitExecutor.registerSynchronization();
    }
}

基本上使用它還是為了操作數(shù)據(jù),所以需要把參數(shù)傳給他。

一、成員變量

最簡單的方法是添加一個成員屬性。

@Component
public class AfterTransactionCommitExecutor extends TransactionSynchronizationAdapter {

    private Object parameter;

    @Override
    public void afterCommit() {
        // 事務提交后使用參數(shù)執(zhí)行操作
        doSomethingWithParameter(parameter);
    }

    public void setParameter(Object parameter) {
        this.parameter = parameter;
    }

    private void doSomethingWithParameter(Object parameter) {
    }

    public void registerSynchronization() {
        TransactionSynchronizationManager.registerSynchronization(this);
    }
}
@Service
public class SomeService {

    @Autowired
    private AfterTransactionCommitExecutor afterTransactionCommitExecutor;

    @Transactional
    public void doWork(Object parameter) {
        // 設置參數(shù)
        afterTransactionCommitExecutor.setParameter(parameter);
        // 注冊事務同步回調
        afterTransactionCommitExecutor.registerSynchronization();
    }
}

二、每次創(chuàng)建匿名類對象

@Service
public class SomeService {

    @Transactional
    public void doWork(final Object parameter) {
        // 業(yè)務邏輯...

        // 注冊事務同步回調并傳遞參數(shù)
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                doSomethingWithParameter(parameter);
            }
        });
    }

    private void doSomethingWithParameter(Object parameter) {
        // 使用參數(shù)執(zhí)行相關操作
    }
}

需要注意的是,使用成員變量傳遞參數(shù)時,如果多個事務并發(fā)執(zhí)行,可能會存在線程安全問題。為了避免這個問題,可以使用ThreadLocal來存儲參數(shù),或者在事務方法中每次都創(chuàng)建一個新的TransactionSynchronization實例。

小編推薦閱讀

好特網發(fā)布此文僅為傳遞信息,不代表好特網認同期限觀點或證實其描述。

RPG Ri序章 0.2.1
RPG Ri序章 0.2.1
類型:角色扮演  運營狀態(tài):正式運營  語言: 日文  

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動

《RPG_Ri序章》是GameMaker'Child-Dream'制作的一款幻想廢土風RPG手游,完全免費的幻想廢土風RPG登場!元

相關視頻攻略

更多

掃二維碼進入好特網手機版本!

掃二維碼進入好特網微信公眾號!

本站所有軟件,都由網友上傳,如有侵犯你的版權,請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網安備:43070202000427號© 2013~2024 haote.com 好特網