探索 TransactionSynchronizationManager.afterCommit 的原理及使用

在日常的企業級開發中,我們經常需要在事務提交之后執行一些操作,例如記錄日志、發送通知等。Spring 提供了一個方便的機制來實現這個需求,那就是 TransactionSynchronizationManager.afterCommit。本文將詳細探討 TransactionSynchronizationManager.afterCommit 的原理及其使用方法。

1. 什么是 TransactionSynchronizationManager

TransactionSynchronizationManager 是 Spring 框架提供的一個用于管理事務同步的工具類。它允許你在事務的不同階段注冊回調,例如在事務提交前后、事務回滾前后等。其中,afterCommit 方法用于在事務成功提交后執行特定的操作。

2. TransactionSynchronizationManager.afterCommit 的工作原理

TransactionSynchronizationManager.afterCommit 依賴于 Spring 的事務管理機制。具體而言,當事務管理器檢測到事務成功提交時,它會觸發所有注冊的 afterCommit 回調。這個過程包括以下幾個步驟:

  1. 事務開始:Spring 事務管理器開始一個新的事務。
  2. 事務操作:在事務上下文中執行各種數據庫操作。
  3. 注冊回調:通過 TransactionSynchronizationManager.registerSynchronization 方法注冊一個事務同步器,該同步器包含 afterCommit 回調。
  4. 事務提交:當事務操作完成并成功提交時,事務管理器會通知所有注冊的同步器。
  5. 執行回調:事務同步器調用其 afterCommit 方法,執行注冊的回調操作。

3. 使用示例

下面是一個使用 TransactionSynchronizationManager.afterCommit 的示例,展示如何在事務提交后記錄日志。

示例代碼

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;@Service
public class BusinessService {@Autowiredprivate StatusChangeLogRepository logRepository;@Transactionalpublic void changeStatus(Long entityId, String newStatus) {String oldStatus = getStatus(entityId);// 注冊 afterCommit 回調TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {StatusChangeLog log = new StatusChangeLog();log.setEntityId(entityId);log.setOldStatus(oldStatus);log.setNewStatus(newStatus);logRepository.save(log);System.out.println("After commit: Status change logged");}});// 更新狀態的業務邏輯updateStatus(entityId, newStatus);}private String getStatus(Long entityId) {// 獲取當前狀態的邏輯return "current_status"; // 示例}private void updateStatus(Long entityId, String newStatus) {// 更新狀態的邏輯System.out.println("Status updated to " + newStatus);}
}

解釋

  1. 獲取舊狀態:首先,我們獲取實體的當前狀態。
  2. 注冊 afterCommit 回調:使用 TransactionSynchronizationManager.registerSynchronization 方法注冊一個事務同步器,當事務提交后,該同步器會調用其 afterCommit 方法,記錄狀態變更日志。
  3. 更新狀態:執行實際的狀態更新操作。

4. 事務傳播行為對 afterCommit 的影響

在實際應用中,我們可能會遇到嵌套事務的場景。在這些情況下,傳播行為(Propagation Behavior)會影響 afterCommit 的執行時機和行為。

傳播行為示例

假設我們有兩個服務類 ParentServiceChildService,并且在 ChildService 中注冊 afterCommit 回調。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class ParentService {@Autowiredprivate ChildService childService;@Transactional(propagation = Propagation.REQUIRED)public void parentMethod() {System.out.println("Parent method start");childService.childMethod();System.out.println("Parent method end");}
}@Service
public class ChildService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void childMethod() {System.out.println("Child method start");TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {System.out.println("Child after commit");}});System.out.println("Child method end");}
}

解釋

  • Propagation.REQUIRED:如果父方法和子方法都使用 Propagation.REQUIRED,它們將共享同一個事務。如果事務提交,afterCommit 回調將在整個事務提交后執行。
  • Propagation.REQUIRES_NEW:如果子方法使用 Propagation.REQUIRES_NEW,它將開啟一個新的事務,獨立于父事務。子事務的 afterCommit 回調將在子事務提交后立即執行,而不等待父事務的完成。

5. 常見問題

可以在沒有事務的情況下使用 afterCommit 嗎?

不可以。TransactionSynchronizationManager.afterCommit 依賴于事務上下文,如果沒有事務上下文,調用該方法將拋出 IllegalStateException 異常。

可以注冊多個 afterCommit 回調嗎?

可以。在一個事務中,可以注冊多個 afterCommit 回調,它們會按照注冊順序依次執行。

6. 總結

TransactionSynchronizationManager.afterCommit 是一個強大的工具,用于在事務提交后執行回調操作。通過理解其工作原理和使用方法,你可以在事務成功提交后執行所需的操作,如記錄日志、發送通知等。需要注意的是,afterCommit 依賴于事務上下文,因此在使用時要確保事務正確配置,并根據需求選擇合適的事務傳播行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46152.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開發指南】HTML和JS編寫多用戶VR應用程序的框架

1.概述 Networked-Aframe 的工作原理是將實體及其組件同步到連接的用戶。要連接到房間,您需要將networked-scene組件添加到a-scene元素。對于要同步的實體,請向其添加networked組件。默認情況下,position和rotation組件是同步的,…

同三維T80004解碼器視頻使用操作說明書:高清HDMI解碼器,高清SDI解碼器,4K超清HDMI解碼器,雙路4K超高清解碼器

同三維T80004解碼器視頻使用操作說明書:高清HDMI解碼器,高清SDI解碼器,4K超清HDMI解碼器,雙路4K超高清解碼器 同三維T80004解碼器系列視頻使用操作說明書:高清HDMI解碼器,高清SDI解碼器,4K超清H…

未來的社交標桿:如何通過AI讓Facebook更加智能化?

在當今信息爆炸的時代,社交媒體平臺的智能化已成為提高用戶體驗和互動質量的關鍵因素。Facebook,作為全球最大的社交平臺之一,通過人工智能(AI)的廣泛應用,正不斷推進其智能化進程。本文將探討Facebook如何…

CAS的原理

CAS(Compare-And-Swap 或 Compare-And-Set)是一種用于實現并發編程中無鎖(lock-free)數據結構的原子操作。CAS 操作比較內存中的某個位置的當前值是否等于預期值,如果相等,則將其更新為新的值,否…

代碼隨想錄學習 54day 圖論 from代碼隨想錄

圖論總結篇 從深搜廣搜 到并查集,從最小生成樹到拓撲排序, 最后是最短路算法系列。至此算上本篇,一共30篇文章,圖論之旅就在此收官了。在0098.所有可達路徑 ,我們接觸了兩種圖的存儲方式,鄰接表和鄰接矩陣…

B樹(B-Tree)數據結構

1. 什么是B樹? B樹(B-Tree)是一種多路搜索樹,用于存儲和檢索大量數據。它是自適應的,適用于各種存儲設備和各種數據量。B樹的特點是高效的搜索、插入和刪除操作,且可以在各種情況下保持樹的平衡。 2. B樹…

昇思25天學習打卡營第16天 | Vision Transformer圖像分類

昇思25天學習打卡營第16天 | Vision Transformer圖像分類 文章目錄 昇思25天學習打卡營第16天 | Vision Transformer圖像分類Vision Transform(ViT)模型TransformerAttention模塊Encoder模塊 ViT模型輸入 模型構建Multi-Head Attention模塊Encoder模塊Pa…

工業三防平板助力工廠生產數據實時管理

在當今高度數字化和智能化的工業生產環境中,工業三防平板正逐漸成為工廠實現生產數據實時管理的得力助手。這種創新的技術設備不僅能夠在惡劣的工業環境中穩定運行,還為工廠的生產流程優化、效率提升和質量控制帶來了前所未有的機遇。 工業生產場景通常充…

機器學習——數據預處理和特征工程(sklearn)

目錄 一、數據挖掘流程 1. 獲取數據 2. 數據預處理 3. 特征工程 4. 建模,測試模型并預測出結果 5. 驗證模型效果 二、sklearn中的相關包 1.sklearn.preprocessing 2.sklearn.Impute 3.sklearn.feature_selection 4.sklearn.decomposition 三、數據預處理…

【網絡安全】PostMessage:分析JS實現XSS

未經許可,不得轉載。 文章目錄 前言示例正文 前言 PostMessage是一個用于在網頁間安全地發送消息的瀏覽器 API。它允許不同的窗口(例如,來自同一域名下的不同頁面或者不同域名下的跨域頁面)進行通信,而無需通過服務器…

【Arduino IDE】安裝及開發環境、ESP32庫

一、Arduino IDE下載 二、Arduino IDE安裝 三、ESP32庫 四、Arduino-ESP32庫配置 五、新建ESP32-S3N15R8工程文件 樂鑫官網 Arduino官方下載地址 Arduino官方社區 Arduino中文社區 一、Arduino IDE下載 ESP-IDF、MicroPython和Arduino是三種不同的開發框架,各自適…

定制開發AI智能名片商城微信小程序在私域流量池構建中的應用與策略

摘要 在數字經濟蓬勃發展的今天,私域流量已成為企業競爭的新戰場。定制開發AI智能名片商城微信小程序,作為私域流量池構建的創新工具,正以其獨特的優勢助力企業實現用戶資源的深度挖掘與高效轉化。本文深入探討了定制開發AI智能名片商城微信…

.NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 簡介及區別

簡述 在軟件開發的宇宙中,.NET是一個不斷擴展的星系,每個版本都像是一顆獨特的星球,擁有自己的特性和環境。作為技術經理,站在選擇的十字路口,您需要一張詳盡的星圖來導航。本文將作為您的向導,帶您穿越從.…

AIoTedge智能物聯網邊緣計算平臺:引領未來智能邊緣技術

引言 隨著物聯網技術的飛速發展,我們正步入一個萬物互聯的時代。AIoTedge智能物聯網邊緣計算平臺,以其創新的邊云協同架構,為智能設備和系統提供了強大的數據處理和智能決策能力,開啟了智能物聯網的新篇章。 智能邊緣計算平臺的核…

LLaMA-Factory

文章目錄 一、關于 LLaMA-Factory項目特色性能指標 二、如何使用1、安裝 LLaMA Factory2、數據準備3、快速開始4、LLaMA Board 可視化微調5、構建 DockerCUDA 用戶:昇騰 NPU 用戶:不使用 Docker Compose 構建CUDA 用戶:昇騰 NPU 用戶&#xf…

【Java項目筆記】01項目介紹

一、技術框架 1.后端服務 Spring Boot為主體框架 Spring MVC為Web框架 MyBatis、MyBatis Plus為持久層框架,負責數據庫的讀寫 阿里云短信服務 2.存儲服務 MySql redis緩存數據 MinIO為對象存儲,存儲非結構化數據(圖片、視頻、音頻&a…

推薦一款處理TCP數據的架構--EasyTcp4Net

EasyTcp4Net是一個基于c# Pipe,ReadonlySequence的高性能Tcp通信庫,旨在提供穩定,高效,可靠的tcp通訊服務。 基礎的消息通訊 重試機制 超時機制 SSL加密通信支持 KeepAlive 流量背壓控制 粘包和斷包處理 (支持固定頭處理,固定長度處理,固定字符處理) 日志支持Pipe &…

Spring MVC 的常用注解

RequestMapping 和 RestController注解 上面兩個注解,是Spring MCV最常用的注解。 RequestMapping , 他是用來注冊接口的路由映射。 路由映射:當一個用戶訪問url時,將用戶的請求對應到某個方法或類的過程叫做路由映射。 Reques…

定制QCustomPlot 帶有ListView的QCustomPlot 全網唯一份

定制QCustomPlot 帶有ListView的QCustomPlot 文章目錄 定制QCustomPlot 帶有ListView的QCustomPlot摘要需求描述實現關鍵字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,順便點贊搜藏一下;不是直接右上角。 QCustomPlot是一款…

基于springboot+vue+uniapp的駕校預約平臺小程序

開發語言:Java框架:springbootuniappJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包&#…