欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中TransactionSynchronizationManager的使用詳解

 更新時(shí)間:2023年09月19日 09:00:12   作者:韓_師兄  
這篇文章主要介紹了Spring中TransactionSynchronizationManager的使用詳解,TransactionSynchronizationManager是事務(wù)同步管理器,監(jiān)聽事務(wù)的操作,來(lái)實(shí)現(xiàn)在事務(wù)前后可以添加一些指定操作,需要的朋友可以參考下

1 概述

TransactionSynchronizationManager : 事務(wù)同步管理器,監(jiān)聽事務(wù)的操作,來(lái)實(shí)現(xiàn)在事務(wù)前后可以添加一些指定操作

在遇到一些場(chǎng)景, 如上一步保存的數(shù)據(jù), 在接下來(lái)的異步處理的業(yè)務(wù)中有使用,但是因?yàn)楸4鏀?shù)據(jù)過(guò)程中,可能出現(xiàn)異常,導(dǎo)致數(shù)據(jù)回滾,那么后續(xù)的業(yè)務(wù)操作也需要放棄. 對(duì)于上述業(yè)務(wù)場(chǎng)景, 可以使用TransactionSynchronizationManager解決問(wèn)題

查看一下 TransactionSynchronizationManager 類 :

public abstract class TransactionSynchronizationManager {
	private static final Log logger = LogFactory.getLog(TransactionSynchronizationManager.class);
	private static final ThreadLocal<Map<Object, Object>> resources =
			new NamedThreadLocal<>("Transactional resources");
	private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
			new NamedThreadLocal<>("Transaction synchronizations");
	private static final ThreadLocal<String> currentTransactionName =
			new NamedThreadLocal<>("Current transaction name");
	private static final ThreadLocal<Boolean> currentTransactionReadOnly =
			new NamedThreadLocal<>("Current transaction read-only status");
	private static final ThreadLocal<Integer> currentTransactionIsolationLevel =
			new NamedThreadLocal<>("Current transaction isolation level");
	private static final ThreadLocal<Boolean> actualTransactionActive =
			new NamedThreadLocal<>("Actual transaction active");
    // ...
}

參數(shù)說(shuō)明:

  • resources 保存連接資源, 一個(gè)方法里面可能包含兩個(gè)事務(wù)(比如事務(wù)傳播特性為:TransactionDefinition#PROPAGATION_REQUIRES_NEW),所以就用 Map 來(lái)保存資源.
  • synchronizations 線程同步器,對(duì) Spring 事務(wù)的擴(kuò)展. 在Spring中通過(guò)@Transactional注解,在方法上,這個(gè)方法就有事務(wù)特性.
  • currentTransactionReadOnly 保存當(dāng)前事務(wù)是否只讀
  • currentTransactionName 保存當(dāng)前事務(wù)名稱,默認(rèn)為空
  • currentTransactionIsolationLevel 保存當(dāng)前事務(wù)的隔離級(jí)別
  • actualTransactionActive 保存當(dāng)前事務(wù)是否還處于Active活躍狀態(tài)

2 案例

以常見的用戶注冊(cè),然后發(fā)送激活碼為例.

    public void save(){
        // 保存用戶
        saveUser();
        // 發(fā)送消息 異步執(zhí)行
        executorService.execute(() -> sendMessage());
    }

說(shuō)明:

在用戶注冊(cè)操作, 會(huì)將用戶信息報(bào)錯(cuò),可能會(huì)調(diào)一些其他模塊,如積分模塊等等, 進(jìn)行數(shù)據(jù)庫(kù)報(bào)錯(cuò)操作.會(huì)進(jìn)行數(shù)據(jù)回滾, 但是異步操作,此時(shí)不能再進(jìn)行回滾了.

所以我們需要等保存數(shù)據(jù)的事務(wù),已經(jīng)完成提交,再執(zhí)行異步操作.

改造:

    public void save(){
        // 保存用戶
        saveUser();
        // 判斷當(dāng)前線程是否存在活躍狀態(tài)的事務(wù)
        boolean actualTransactionActive = TransactionSynchronizationManager.isActualTransactionActive();
        // 不存在則事務(wù)都完成
        if (!actualTransactionActive){
            // 異步操作 發(fā)送消息
            executorService.execute(() -> sendMessage());
        }else{
            // 存在活躍事務(wù), 則監(jiān)聽事務(wù), afterCommit是指事務(wù)提交完再執(zhí)行
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                @Override
                public void afterCommit() {
                   // 異步操作 發(fā)送消息
                    executorService.execute(() -> sendMessage());
                }
            });
        }
}

通過(guò)TransactionSynchronizationManager,保證當(dāng)前線程的事務(wù)都提交完成后,再進(jìn)行異步的消息發(fā)送,解決了上述的問(wèn)題. 避免出現(xiàn)數(shù)據(jù)未保存,而發(fā)送激活碼或提示信息等.

查看一下 TransactionSynchronizationAdapter 類

public abstract class TransactionSynchronizationAdapter implements TransactionSynchronization, Ordered {
	@Override
	public int getOrder() {
		return Ordered.LOWEST_PRECEDENCE;
	}
    // 暫停此同步 應(yīng)該從事務(wù)同步管理器中解綁資源
	@Override
	public void suspend() {
	}
    //  恢復(fù)此同步。 應(yīng)該將資源重新綁定到 TransactionSynchronizationManager
	@Override
	public void resume() {
	}
    // 將基礎(chǔ)會(huì)話刷新到數(shù)據(jù)存儲(chǔ)
	@Override
	public void flush() {
	}
    // 在事務(wù)提交之前調(diào)用(在完成之前之前)順序倒數(shù)第四
	@Override
	public void beforeCommit(boolean readOnly) {
	}
    // 在事務(wù)提交/回滾之前調(diào)用。順序倒數(shù)第三
	@Override
	public void beforeCompletion() {
	}
    // 在事務(wù)提交后調(diào)用  順序倒數(shù)第二
	@Override
	public void afterCommit() {
	}
    // 在事務(wù)提交/回滾后調(diào)用 可以進(jìn)行資源清理 順序倒數(shù)第一
	@Override
	public void afterCompletion(int status) {
	}
}

根據(jù)上述類方法含義,通常業(yè)務(wù)選擇使用afterCommit進(jìn)行重寫,執(zhí)行異步業(yè)務(wù)操作.

3 總結(jié)

在上述問(wèn)題已經(jīng)場(chǎng)景, 之前有遇到過(guò)幾次, 都是采用了其他方法解決, 那些方法或多或少都有一些問(wèn)題,如甚至使用過(guò)編程式事務(wù)去進(jìn)行二次控制.而使用TransactionSynchronizationManager, 則是很符合這個(gè)業(yè)務(wù)場(chǎng)景的需求.

到此這篇關(guān)于Spring中TransactionSynchronizationManager的使用詳解的文章就介紹到這了,更多相關(guān)TransactionSynchronizationManager的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 純Java代碼實(shí)現(xiàn)流星劃過(guò)天空

    純Java代碼實(shí)現(xiàn)流星劃過(guò)天空

    本文給大家介紹純java代碼實(shí)現(xiàn)流星劃過(guò)天空,包括流星個(gè)數(shù),流星飛行的速度,色階,流星大小相關(guān)變量設(shè)置。對(duì)java流星劃過(guò)天空特效代碼感興趣的朋友可以參考下本文
    2015-10-10
  • java實(shí)現(xiàn)人工智能化屏幕監(jiān)控窗口

    java實(shí)現(xiàn)人工智能化屏幕監(jiān)控窗口

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)人工智能化屏幕監(jiān)控窗口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • java內(nèi)存優(yōu)化的方法總結(jié)

    java內(nèi)存優(yōu)化的方法總結(jié)

    在本篇文章里小編給大家分享的是一篇關(guān)于java內(nèi)存優(yōu)化的方法總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-06-06
  • IDEA熱部署配置詳細(xì)教程

    IDEA熱部署配置詳細(xì)教程

    這篇文章主要介紹了IDEA熱部署配置詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Mybatis 簡(jiǎn)單啟動(dòng)過(guò)程入門詳解

    Mybatis 簡(jiǎn)單啟動(dòng)過(guò)程入門詳解

    MyBatis是一個(gè)持久層框架,簡(jiǎn)化JDBC操作,SpringBoot集成MyBatis,通過(guò)創(chuàng)建項(xiàng)目、準(zhǔn)備數(shù)據(jù)、配置文件、實(shí)體類和接口,可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作,使用@Mapper和@Select注解簡(jiǎn)化接口實(shí)現(xiàn),測(cè)試類使用@SpringBootTest和@Test注解啟動(dòng),本文介紹Mybatis啟動(dòng)過(guò)程,感興趣的朋友一起看看吧
    2025-03-03
  • Java for循環(huán)詳解

    Java for循環(huán)詳解

    這篇文章主要介紹了Java for循環(huán)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Kosaraju算法詳解

    Kosaraju算法詳解

    這篇文章主要為大家詳細(xì)介紹了Kosaraju算法,Kosaraju算法可以計(jì)算出一個(gè)有向圖的強(qiáng)連通分量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 詳解Springboot如何優(yōu)雅的進(jìn)行數(shù)據(jù)校驗(yàn)

    詳解Springboot如何優(yōu)雅的進(jìn)行數(shù)據(jù)校驗(yàn)

    基于?Spring?Boot?,如何“優(yōu)雅”的進(jìn)行數(shù)據(jù)校驗(yàn)?zāi)?,本文將待大家詳?xì)介紹Springboot如何優(yōu)雅的進(jìn)行數(shù)據(jù)校驗(yàn),文中有詳細(xì)的代碼示例和流程步驟,需要的朋友可以參考下
    2023-06-06
  • Java持久層框架MyBatis簡(jiǎn)單實(shí)例

    Java持久層框架MyBatis簡(jiǎn)單實(shí)例

    MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。本文重點(diǎn)給大家介紹Java持久層框架MyBatis簡(jiǎn)單實(shí)例,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07
  • IDEA找不到j(luò)dk該如何解決

    IDEA找不到j(luò)dk該如何解決

    這篇文章主要給大家介紹了關(guān)于IDEA找不到j(luò)dk該如何解決的相關(guān)資料,剛安裝好IDEA后,我們運(yùn)行一個(gè)項(xiàng)目時(shí)候,有時(shí)候會(huì)遇到顯示找不到Java的JDK,需要的朋友可以參考下
    2023-11-11

最新評(píng)論