Spring編程式事務(本地事務)

使用?TransactionTemplate等類和 API 手動管理事務,控制事務的新建、提交、回滾等過程

方式一:使用 TransactionTemplate(推薦方式)

@Service
public class OrderService {private final TransactionTemplate transactionTemplate;private final OrderRepository orderRepository;private final InventoryRepository inventoryRepository;public OrderService(PlatformTransactionManager txManager,OrderRepository orderRepository,InventoryRepository inventoryRepository) {this.transactionTemplate = new TransactionTemplate(txManager);this.orderRepository = orderRepository;this.inventoryRepository = inventoryRepository;}public void createOrder(Order order) {transactionTemplate.execute(status -> {try {// 操作1: 保存訂單orderRepository.save(order);// 操作2: 扣減庫存inventoryRepository.deductStock(order.getProductId(), order.getQuantity());return "SUCCESS";} catch (Exception e) {status.setRollbackOnly(); // 標記回滾throw new RuntimeException("Transaction rolled back", e);}});}
}

方式二:使用 PlatformTransactionManager(精細控制)

@Service
public class PaymentService {private final PlatformTransactionManager txManager;private final PaymentRepository paymentRepository;public PaymentService(PlatformTransactionManager txManager, PaymentRepository paymentRepository) {this.txManager = txManager;this.paymentRepository = paymentRepository;}public void processPayment(Payment payment) {// 定義事務屬性(傳播行為、隔離級別)DefaultTransactionDefinition definition = new DefaultTransactionDefinition();definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);TransactionStatus status = txManager.getTransaction(definition);try {// 業務操作paymentRepository.save(payment);// 模擬外部服務調用(若失敗需回滾)if (!externalPaymentGateway.charge(payment)) {throw new RuntimeException("Payment failed");}txManager.commit(status);} catch (Exception e) {txManager.rollback(status);throw e;}}
}

為什么不建議用聲明式事務?

1)粒度不可控,最低是方法級別,容易造成大事務

2)使用不當,可能造成事務回滾不完全造成業務故障,如方法中調用了第三方接口,接口調用不能回滾

3)失效場景眾多,一不小心就會造成事務失效

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

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

相關文章

itext7 html2pdf 將html文本轉為pdf

1、將html轉為pdf需求分析 經常會看到爬蟲有這樣的需求,將某一個網站上的數據,獲取到了以后,進行分析,然后將需要的數據進行存儲,也有將html轉為pdf進行存儲,作為原始存檔,當然這里看具體的需求…

企業級低代碼平臺的架構范式轉型研究

在快速迭代的數字時代,低代碼平臺如同一股清流,悄然成為開發者們的新寵。 它利用直觀易用的拖拽式界面和豐富的預制組件,將應用程序的開發過程簡化到了前所未有的程度。通過封裝復雜的編程邏輯和提供強大的集成能力,低代碼平臺讓…

C++ | STL之list詳解:雙向鏈表的靈活操作與高效實踐

引言 std::list 是C STL中基于雙向鏈表實現的順序容器,擅長高效插入和刪除操作,尤其適用于頻繁修改中間元素的場景。與std::vector不同,std::list的內存非連續,但提供了穩定的迭代器和靈活的元素管理。本文將全面解析std::list的…

AI運算服務器工控機特點與應用

AI運算服務器工控機是專門針對工業環境設計的計算設備,結合了傳統工控機(工業控制計算機)的可靠性與AI服務器的強大算力,廣泛應用于智能制造、邊緣計算、機器視覺、自動化控制等領域。以下是其核心特點、應用場景及選型建議&#…

25/4/9 算法筆記 DBGAN+強化學習+遷移學習實現青光眼圖像去模糊1

整體實驗介紹 實驗主要是結合DBGAN對抗網絡強化學習增強遷移學習增強實現青光眼圖像去模糊。今天則是先完成了DBGAN板塊模型的訓練。 實驗背景介紹 青光眼的主要特征有: 視盤形態與杯盤比CDR:青光眼患者主要表現為視杯擴大,盤沿變窄。 視…

智能復盤自動化系統搭建指南—基于DeepSeek API與Apple日歷的整合實踐

一、系統架構設計 本方案通過iOS快捷指令實現日歷數據與AI分析的自動化交互,核心流程包含: 日歷事件管理 創建每日循環的"AI復盤"日歷事項實現當日備注信息的動態更新 數據處理模塊時間日志標準化處理多維度數據特征提取 AI交互層對接DeepSeek…

01 位運算

12days 章節結構 00 算法前導課-編程基礎(自學的視頻) 01 位運算的奇巧淫技 02 查找與排序(上) 03 數組、查找與排序(下) 04 多維數組與矩陣 05 字符串專題 06 基本數學問題 06 遞歸、DFS、剪枝、回溯等問題 07 貪心策…

HDFS Full Block Report超限導致性能下降的原因分析

文章目錄 前言發現問題失敗的為什么是FBR塊匯報頻率的變化為什么FBR會反復失敗HDFS性能下降導致Yarn負載變高的形式化分析理解線程理解IO Wait理解HDFS性能下降導致Yarn負載和使用率增高 引用 前言 我們的Yarn Cluster主要用來運行一批由Airflow定時調度的Spark Job&#xff0…

【Kubernetes基礎--Pod深入理解】--查閱筆記2

深入理解Pod 為什么要有個Pod1. 容器協作與資源共享2. 簡化調度和資源管理3. 設計模式支持 Pod 基本用法Pod 容器共享 VolumePod 的配置管理ConfigMap 概述創建 ConfigMap 資源對象在 Pod 中使用 ConfigMap使用 ConfigMap 的限制條件 為什么要有個Pod Pod 的引入并非技術冗余&…

Margin和Padding在WPF和CSS中的不同

CSS和WPF中 margin 與 padding 在方向上的規定基本一致,但在使用場景和一些細節上有所不同。 CSS - 方向規定: margin 和 padding 屬性可以分別指定上、右、下、左四個方向的值。例如 margin:10px 20px 30px 40px; 表示上外邊距為10px、右外邊距為20…

gravity`(控制 View 內部內容的對齊方式)

文章目錄 **1. 常用取值****示例** **2. layout_gravity(控制 View 在父容器中的對齊方式)****常用取值****示例** **3. gravity vs layout_gravity 對比****4. 注意事項****5. 總結** 作用對象:當前 View 的內部內容(如 TextView…

Go:使用共享變量實現并發

競態 在串行程序中,步驟執行順序由程序邏輯決定;而在有多個 goroutine 的并發程序中,不同 goroutine 的事件先后順序不確定,若無法確定兩個事件先后,它們就是并發的。若一個函數在并發調用時能正確工作,稱…

Vue3 SSR Serverless架構革命:彈性計算與量子加速

一、全維度Serverless SSR架構 1.1 蜂巢式彈性調度系統 1.2 冷啟動時間優化表 優化策略Node.js冷啟(ms)Deno冷啟(ms)Bun冷啟(ms)裸啟動1800960420預編譯二進制650380210內存快照預熱22016090WASM實例池15011075量子狀態預載453832 二、邊緣渲染協議升級 2.1 流式SSR響應協議…

FPAG IP核調用小練習

一、調用步驟 1、打開Quartus 右上角搜索ROM,如圖所示 2、點擊后會彈出如圖所示 其中文件路徑需要選擇你自己的 3、點擊OK彈出如圖所示 圖中紅色改為12與1024 4、然后一直點NEXT,直到下圖 這里要選擇后綴為 .mif的文件 5、用C語言生成 .mif文件 //…

Spring Cloud 服務間調用深度解析

前言 在構建微服務架構時,服務間的高效通信是至關重要的。Spring Cloud 提供了一套完整的解決方案來實現服務間的調用、負載均衡、服務發現等功能。本文將深入探討 Spring Cloud 中服務之間的調用機制,并通過源碼片段和 Mermaid 圖表幫助讀者更好地理解…

AF3 generate_chain_data_cache腳本解讀

AlphaFold3 generate_chain_data_cache 腳本在源代碼的scripts文件夾下。該腳本從指定目錄中批量解析 mmCIF/PDB 文件的工具,并將每個鏈的基本信息(序列、分辨率、是否屬于聚類等)提取并寫入 JSON 文件,主要用于后續蛋白質建模、過濾或訓練數據準備。 源代碼: import ar…

vue項目打包部署到maven倉庫

需要的資源文件,都放在根目錄下: 1. versionInfo.js const fs require(fs) const path require(path) const mkdirp require(mkdirp) const spawn require(child_process).spawnconst packageObj require(./package.json) const versionNo packa…

MegaTTS3: 下一代高效語音合成技術,重塑AI語音的自然與個性化

在近期的發布中,浙江大學趙洲教授團隊與字節跳動聯合推出了革命性的第三代語音合成模型——MegaTTS3,該模型不僅在多個專業評測中展現了卓越的性能,還為AI語音的自然性和個性化開辟了新的篇章。 MegaTTS3技術亮點 零樣本語音合成 MegaTTS3采用…

【教程】PyTorch多機多卡分布式訓練的參數說明 | 附通用啟動腳本

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 目錄 torchrun 一、什么是 torchrun 二、torchrun 的核心參數講解 三、torchrun 會自動設置的環境變量 四、torchrun 啟動過程舉例 機器 A&#…

計算機視覺——基于 Yolov8 目標檢測與 OpenCV 光流實現目標追蹤

1. 概述 目標檢測(Object Detection)和目標追蹤(Object Tracking)是計算機視覺中的兩個關鍵技術,它們在多種實際應用場景中發揮著重要作用。 目標檢測指的是在靜態圖像或視頻幀中識別出特定類別的目標對象&#xff0…