SpringBoot事務管理(四)

記錄幾條SpringBoot事務管理中踩過的坑及解決辦法:

1. 自調用問題

問題描述

在同一個類中,一個非事務方法調用另一個有 @Transactional 注解的事務方法,事務不會生效。因為 Spring 的事務管理是基于 AOP 代理實現的,自調用時不會經過代理對象,所以事務注解不起作用。

示例代碼
@Service
public class UserService {public void nonTransactionalMethod() {// 調用事務方法this.transactionalMethod(); }@Transactionalpublic void transactionalMethod() {// 數據庫操作}
}
解決辦法

可以通過注入自身的代理對象來解決自調用問題,或者將事務方法提取到另一個服務類中。

@Service
public class UserService {@Autowiredprivate UserService self;public void nonTransactionalMethod() {// 通過代理對象調用事務方法self.transactionalMethod(); }@Transactionalpublic void transactionalMethod() {// 數據庫操作}
}

2. 異常捕獲問題

問題描述

在事務方法中捕獲了異常但沒有重新拋出,會導致事務不會回滾。因為 Spring 默認只對未檢查異常(如 RuntimeException 及其子類)進行回滾,捕獲異常后沒有拋出,Spring 無法感知到異常,就不會觸發回滾機制。

示例代碼
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void saveUser(User user) {try {userRepository.save(user);// 模擬異常int result = 1 / 0; } catch (Exception e) {// 捕獲異常但未重新拋出e.printStackTrace(); }}
}
解決辦法

在捕獲異常后,根據業務需求重新拋出未檢查異常,或者在 @Transactional 注解中指定需要回滾的異常類型。

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(rollbackFor = Exception.class)public void saveUser(User user) {try {userRepository.save(user);// 模擬異常int result = 1 / 0; } catch (Exception e) {// 重新拋出異常throw new RuntimeException(e); }}
}

3. 事務傳播行為誤用

問題描述

在嵌套事務中,如果錯誤地使用了事務傳播行為,可能會導致事務管理不符合預期。例如,在需要獨立事務的場景下使用了 REQUIRED 傳播行為,會使內層事務加入到外層事務中,當外層事務回滾時,內層事務也會回滾。

示例代碼
@Service
public class OrderService {@Autowiredprivate PaymentService paymentService;@Transactionalpublic void createOrder(Order order) {// 創建訂單// 調用支付服務paymentService.processPayment(order); }
}@Service
public class PaymentService {@Transactional(propagation = Propagation.REQUIRED)public void processPayment(Order order) {// 處理支付}
}
解決辦法

根據業務需求選擇合適的事務傳播行為。如果需要獨立事務,可以使用 REQUIRES_NEW 傳播行為。

@Service
public class PaymentService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void processPayment(Order order) {// 處理支付}
}

4. 數據庫隔離級別不匹配

問題描述

在不同的數據庫和業務場景下,如果使用了不匹配的事務隔離級別,可能會出現數據不一致的問題。例如,在高并發場景下使用了較低的隔離級別,可能會導致臟讀、不可重復讀和幻讀問題。

示例代碼
@Service
public class ProductService {@Transactional(isolation = Isolation.READ_UNCOMMITTED)public Product getProductById(Long id) {// 查詢產品信息return productRepository.findById(id).orElse(null);}
}
解決辦法

根據業務需求和數據庫特性選擇合適的隔離級別。在高并發場景下,為了保證數據一致性,可以使用較高的隔離級別,如 REPEATABLE_READSERIALIZABLE,但要注意可能會影響并發性能。

@Service
public class ProductService {@Transactional(isolation = Isolation.REPEATABLE_READ)public Product getProductById(Long id) {// 查詢產品信息return productRepository.findById(id).orElse(null);}
}

5. 多數據源事務問題

問題描述

在使用多數據源的 Spring Boot 應用中,如果沒有正確配置事務管理器,可能會導致事務管理混亂。不同數據源需要不同的事務管理器來管理事務。

解決辦法

為每個數據源配置獨立的事務管理器,并在 @Transactional 注解中指定使用的事務管理器。

@Configuration
public class DataSourceConfig {@Bean(name = "dataSource1")public DataSource dataSource1() {// 配置數據源 1return DataSourceBuilder.create().build();}@Bean(name = "dataSource2")public DataSource dataSource2() {// 配置數據源 2return DataSourceBuilder.create().build();}@Bean(name = "transactionManager1")public PlatformTransactionManager transactionManager1(@Qualifier("dataSource1") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "transactionManager2")public PlatformTransactionManager transactionManager2(@Qualifier("dataSource2") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}@Service
public class MultiDataSourceService {@Transactional("transactionManager1")public void operationOnDataSource1() {// 對數據源 1 進行操作}@Transactional("transactionManager2")public void operationOnDataSource2() {// 對數據源 2 進行操作}
}

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

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

相關文章

HTTP 1.1長連接問題

在長連接問題上,HTTP 1.1與HTTP 1.0還是有所區別的。 下面一起來看看: HTTP 1.1 支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個 TCP 連接上可以傳送多個 HTTP 請求…

鴻蒙應用元服務開發-Account Kit概述

Account Kit(華為賬號服務)提供簡單、快速、安全的登錄功能,讓用戶快捷地使用華為賬號登錄元服務。用戶授權后,Account Kit可提供頭像、手機號碼等信息,幫助元服務更了解用戶。Account Kit提供的SampleCode示例工程體現…

IP綜合實驗

1.配置eth-trunk進行綁定 [LSW1]interface Eth-Trunk 0 [LSW1-Eth-Trunk0]q [LSW1]interface g0/0/2 [LSW1-GigabitEthernet0/0/2]eth-trunk 0 [LSW1-GigabitEthernet0/0/2]int g0/0/3 [LSW1-GigabitEthernet0/0/3]eth-trunk 0 [LSW1-GigabitEthernet0/0/3]display et…

SAP 學習筆記 - 系統移行業務 - MALSY(由Excel 移行到SAP 的收費工具)

以前有關移行,也寫過一些文章,比如 SAP 學習筆記 - 系統移行業務 - Migration cockpit工具 - 移行Material(品目)-CSDN博客 SAP 學習筆記 - 系統移行業務 - Migration cockpit工具2 - Lot導入_sap cockpit-CSDN博客 SAP學習筆記…

二叉樹搜索樹與雙向鏈表

一:題目 二:思路 把二叉搜索樹的值升序的打印出來,中序打印即可,但是此題不僅僅是有序的打印出二叉搜索樹的值,而是要將其的結構也改變了,也就是說要改變節點間的指向,讓其成為一個雙向鏈表 我…

31天Python入門——第17天:初識面向對象

你好,我是安然無虞。 文章目錄 面向對象編程1. 什么是面向對象2. 類(class)3. 類的實例關于self 4. 對象的初始化5. __str__6. 類之間的關系繼承關系組合關系 7. 補充練習 面向對象編程 1. 什么是面向對象 面向對象編程是一種編程思想,它將現實世界的概念和關系映…

Spring Boot中常用內嵌數據庫(H2、HSQLDB、Derby)的對比,包含配置示例和關鍵差異總結

以下是Spring Boot中常用內嵌數據庫的對比,包含配置示例和關鍵差異總結: 一、主流內嵌數據庫對比 1. H2 數據庫 特點: 支持內存模式(速度快)和文件模式(數據持久化)。支持SQL方言&#xff08…

Apache Hive和Snowflake的`CREATE VIEW`語法和功能特性整理的對比表

寫一個Apache Hive中CREATE VIEW語句轉換為對應Snowflake中CREATE VIEW語句的程序,現在需要一個根據功能的相似性對應的Apache HiveQL和Snowflake SQL的CREATE VIEW語句的表。 以下是基于Apache Hive的CREATE VIEW語法規則構造的所有可能合法語句實例及其功能說明&…

個人博客網站從搭建到上線教程

步驟1:設計個人網站 設計個人博客網站的風格樣式,可以在各個模板網站上多瀏覽瀏覽,以便有更多設計網站風格樣式的經驗。 設計個人博客網站的內容,你希望你的網站包含哪些內容如你的個人基本信息介紹、你想分享的項目、你想分享的技術文檔等等。 步驟2:選擇開發技術棧 因…

PHP回調后門

1.系統命令執行 直接windows或liunx命令 各個程序 相應的函數 來實現 system exec shell_Exec passshru 2.執行代碼 eval assert php代碼 系統 <?php eval($_POST) <?php assert($_POST) 簡單的測試 回調后門函數call_user_func(1,2) 1是回調的函數 2是回調…

Raspberry 樹莓派 CM4模塊的底板設計注意事項

1&#xff0c; 樹莓派CM4底板設計 樹莓派CM4模塊集成了CPU&#xff0c; 存儲器&#xff0c;以太網&#xff0c; 無線模塊&#xff0c;電源等等&#xff0c; 大大降低了硬件設計的要求。對我們使用樹莓派提供了很好的便利性。 本人近期因為項目的需要設計了一款CM4的底板&#x…

Java后端開發(十八)-- 使用JAXB,將JavaBean轉換XML文本

下面是測試時的運行環境: 1.jdk8 2.Maven,可能需要需要的依賴,如下: <dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><gr…

【一起來學kubernetes】30、k8s的java sdk怎么用

Kubernetes Java SDK 是開發者在 Java 應用中與 Kubernetes 集群交互的核心工具&#xff0c;支持資源管理、服務發現、配置操作等功能。 一、主流 Java SDK 對比與選擇 官方 client-java 庫 特點&#xff1a;由 Kubernetes 社區維護&#xff0c;API 與 Kubernetes 原生對象嚴格…

PHP開發者2025生存指南

PHP&#xff0c;這個曾經被戲稱為“世界上最好的語言”的腳本語言&#xff0c;依舊在網絡世界占據著重要的地位。然而&#xff0c;技術發展日新月異&#xff0c;面向2025年&#xff0c;PHP開發者要想保持競爭力甚至實現職業生涯的飛躍&#xff0c;需要不斷學習和提升自身技能。…

MySQL與Redis數據一致性保障方案詳解

前言 在現代分布式系統中&#xff0c;MySQL和Redis的結合使用非常普遍。MySQL作為關系型數據庫負責持久化存儲&#xff0c;而Redis則作為高性能緩存層提升系統的響應速度。然而&#xff0c;在這種架構下&#xff0c;如何保證MySQL與Redis之間的數據一致性是一個重要的挑戰。本…

MySQL響應慢是否由堵塞或死鎖引起?

目錄標題 **1. 檢查當前運行的查詢和進程****2. 查看死鎖日志****方法一&#xff1a;通過錯誤日志****方法二&#xff1a;通過InnoDB狀態** **3. 檢查鎖信息****查看表鎖****查看行鎖&#xff08;InnoDB&#xff09;** **4. 分析慢查詢****開啟慢查詢日志****分析慢查詢** **5.…

【計算機網絡】記錄一次校園網無法上網的解決方法

問題現象 環境&#xff1a;實訓室教室內時間&#xff1a;近期突然出現 &#xff08;推測是學校在施工&#xff0c;部分設備可能出現問題&#xff09;癥狀&#xff1a; 連接校園網 SWXY-WIFI 后&#xff1a; 連接速度極慢偶發無 IP 分配&#xff08;DHCP 失敗&#xff09;即使分…

JavaScript函數式編程思想

1. 相關面試題 1.1. 什么是純函數&#xff1f; 純函數是一種函數&#xff0c;其返回值僅由其輸入參數決定&#xff0c;不產生任何可觀察的副作用&#xff0c;如修改全局對象或外部狀態。 純函數具有以下特性&#xff1a; 1. 確定性&#xff1a;相同的輸入永遠得到相同的輸…

Elasticsearch安全與權限控制指南

在Elasticsearch維護中&#xff0c;安全管理是保障數據合規性和集群穩定性的關鍵。本文將詳細介紹用戶與角色管理、索引/字段級權限控制、HTTPS加密通信、審計日志與合規性檢查等核心安全實踐&#xff0c;希望可以幫助你構建更安全的Elasticsearch環境。 1 用戶與角色管理 1.1…

『VUE』快速入門配置環境使用tailwind css 記憶tailwind css常見規則 (詳細圖文注釋)

目錄 效果預覽快速入門環境配置配置 tailwind.config.js 設置文件添加 Tailwind 的基礎樣式引入樣式到項目檢查構建工具配置測試 Tailwind CSS 效果 使用插件tailwind.config.js的最終內容app.vue演示 為什么不需要記憶 Tailwind 的類名&#xff1f;1. 類名直觀2. 文檔全面3. 工…