最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中TransactionSynchronizationManager的使用詳解

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

1 概述

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

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

查看一下 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ù)說明:

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

2 案例

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

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

說明:

在用戶注冊操作, 會將用戶信息報(bào)錯,可能會調(diào)一些其他模塊,如積分模塊等等, 進(jìn)行數(shù)據(jù)庫報(bào)錯操作.會進(jìn)行數(shù)據(jù)回滾, 但是異步操作,此時不能再進(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());
                }
            });
        }
}

通過TransactionSynchronizationManager,保證當(dāng)前線程的事務(wù)都提交完成后,再進(jìn)行異步的消息發(fā)送,解決了上述的問題. 避免出現(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ǔ)會話刷新到數(shù)據(jù)存儲
	@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é)

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

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

相關(guān)文章

  • Springboot使用ResponseBody漢字返回問號問題

    Springboot使用ResponseBody漢字返回問號問題

    這篇文章主要介紹了Springboot使用ResponseBody漢字返回問號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 淺析對Java關(guān)鍵字final和static的理解

    淺析對Java關(guān)鍵字final和static的理解

    本文主要給大家談?wù)勑【帉ava關(guān)鍵字final和static的理解,本文給大家介紹的較詳細(xì),需要的朋友參考參考下
    2017-04-04
  • 基于Eclipce配置Spring Boot過程圖解

    基于Eclipce配置Spring Boot過程圖解

    這篇文章主要介紹了基于Eclipce配置Spring Boot過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • idea遠(yuǎn)程debug調(diào)試部署在tomcat上項(xiàng)目

    idea遠(yuǎn)程debug調(diào)試部署在tomcat上項(xiàng)目

    本文主要介紹了idea遠(yuǎn)程debug調(diào)試部署在tomcat上項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java在Word中添加多行圖片水印

    Java在Word中添加多行圖片水印

    這篇文章主要介紹了Java在Word中添加多行圖片,圖文講解的很清晰,有對于這方面不懂得同學(xué)可以跟著研究下
    2021-02-02
  • 淺談IDEA實(shí)用的Servlet模板

    淺談IDEA實(shí)用的Servlet模板

    今天給大家分享一下IDEA實(shí)用的Servlet模板,文中有非常詳細(xì)的圖文介紹及代碼示例,對小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-05-05
  • 常用輸入字節(jié)流InputStream介紹

    常用輸入字節(jié)流InputStream介紹

    下面小編就為大家?guī)硪黄S幂斎胱止?jié)流InputStream介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 在Mybatis中association標(biāo)簽多層嵌套的問題

    在Mybatis中association標(biāo)簽多層嵌套的問題

    這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能

    SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能

    Milvus?是一種高性能、高擴(kuò)展性的向量數(shù)據(jù)庫,可在從筆記本電腦到大型分布式系統(tǒng)等各種環(huán)境中高效運(yùn)行,Deeplearning4j(DL4J)是一個開源的深度學(xué)習(xí)框架,專門為Java和Scala開發(fā),本文給大家介紹了SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能
    2024-10-10
  • SpringBoot+mybatis-plus實(shí)現(xiàn)多數(shù)據(jù)源配置的詳細(xì)步驟

    SpringBoot+mybatis-plus實(shí)現(xiàn)多數(shù)據(jù)源配置的詳細(xì)步驟

    在日益復(fù)雜的業(yè)務(wù)場景中,單一數(shù)據(jù)源往往難以滿足微服務(wù)架構(gòu)下的多元化需求,文將詳細(xì)介紹兩種主流的 MyBatis-Plus 多數(shù)據(jù)源配置方式,大家可以根據(jù)需要進(jìn)行選擇
    2025-08-08

最新評論

镇沅| 民县| 兴和县| 长岛县| 马鞍山市| 高淳县| 克什克腾旗| 新疆| 靖江市| 湖北省| 深泽县| 保山市| 布尔津县| 大新县| 宜都市| 芷江| 确山县| 安泽县| 广丰县| 织金县| 广汉市| 龙川县| 巴青县| 天等县| 福建省| 乐东| 乌兰察布市| 新化县| 松溪县| 昌邑市| 收藏| 黎平县| 余姚市| 黄浦区| 天柱县| 登封市| 宁津县| 新郑市| 延寿县| 大化| 安达市|