springboot 事務管理

在Spring Boot中,事務管理是通過Spring框架的事務管理模塊來實現的。Spring提供了聲明式事務管理和編程式事務管理兩種方式。通常,我們使用聲明式事務管理,因為它更簡潔且易于維護。

1. 聲明式事務管理

聲明式事務管理是通過注解來實現的。Spring Boot中使用@Transactional注解來標記需要事務管理的方法或類。

1.1 配置事務管理器

Spring Boot默認使用DataSourceTransactionManager來管理事務。如果你使用的是Spring Boot的自動配置,通常不需要手動配置事務管理器。但如果你有特殊需求,可以手動配置:

java

復制

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
1.2 使用@Transactional注解

你可以在方法或類上使用@Transactional注解來聲明事務。當方法被調用時,Spring會自動開啟事務,并在方法執行完成后提交事務。如果方法拋出異常,事務會回滾。

java

復制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);}@Transactionalpublic void updateUser(User user) {userRepository.save(user);}@Transactional(readOnly = true)public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}
}
1.3 事務傳播行為

@Transactional注解還支持配置事務的傳播行為。例如:

java

復制

@Transactional(propagation = Propagation.REQUIRED)
public void someMethod() {// 業務邏輯
}

常見的傳播行為包括:

  • REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。

  • REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則掛起當前事務。

  • SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務方式執行。

  • NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,則掛起當前事務。

  • MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

  • NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

  • NESTED:如果當前存在事務,則在嵌套事務內執行;如果當前沒有事務,則創建一個新的事務。

1.4 事務隔離級別

@Transactional注解還支持配置事務的隔離級別。例如:

java

復制

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {// 業務邏輯
}

常見的隔離級別包括:

  • DEFAULT:使用底層數據庫的默認隔離級別。

  • READ_UNCOMMITTED:允許讀取未提交的數據變更。

  • READ_COMMITTED:只能讀取已提交的數據變更。

  • REPEATABLE_READ:確保在同一事務中多次讀取同一數據時,結果一致。

  • SERIALIZABLE:最高的隔離級別,確保事務串行執行。

1.5 事務回滾規則

默認情況下,@Transactional注解會在遇到RuntimeException及其子類時回滾事務。你可以通過rollbackFornoRollbackFor屬性來指定回滾的異常類型。

java

復制

@Transactional(rollbackFor = Exception.class)
public void someMethod() throws Exception {// 業務邏輯
}

2. 編程式事務管理

編程式事務管理是通過編寫代碼來手動管理事務的。雖然這種方式更靈活,但代碼會顯得更復雜。

2.1 使用TransactionTemplate

TransactionTemplate是Spring提供的一個工具類,用于簡化編程式事務管理。

java

復制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;@Service
public class UserService {@Autowiredprivate TransactionTemplate transactionTemplate;@Autowiredprivate UserRepository userRepository;public void createUser(User user) {transactionTemplate.execute(status -> {userRepository.save(user);return null;});}
}
2.2 使用PlatformTransactionManager

你也可以直接使用PlatformTransactionManager來手動管理事務。

java

復制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;@Service
public class UserService {@Autowiredprivate PlatformTransactionManager transactionManager;@Autowiredprivate UserRepository userRepository;public void createUser(User user) {TransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(definition);try {userRepository.save(user);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
}

3. 總結

  • 聲明式事務管理:通過@Transactional注解實現,推薦使用。

  • 編程式事務管理:通過TransactionTemplatePlatformTransactionManager實現,適用于復雜場景。

Spring Boot的事務管理非常強大且靈活,能夠滿足大多數應用場景的需求。

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

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

相關文章

windows通過網絡向Ubuntu發送文件/目錄

由于最近要使用樹莓派進行一些代碼練習,但是好多東西都在windows里或虛擬機上,就想將文件傳輸到樹莓派上,但試了發現u盤不能簡單傳送,就在網絡上找到了通過windows 的scp命令傳送 前提是樹莓派先開啟ssh服務,且Window…

字節跳動后端一面

📍1. Gzip壓縮技術詳解 Gzip是一種流行的無損數據壓縮格式,它使用DEFLATE算法來減少文件大小,廣泛應用于網絡傳輸和文件存儲中以提高效率。 🚀 使用場景: ? 網站優化:通過壓縮HTML、CSS、JavaScript文件來…

Leetcode 3448. Count Substrings Divisible By Last Digit

Leetcode 3448. Count Substrings Divisible By Last Digit 1. 解題思路2. 代碼實現 題目鏈接:3448. Count Substrings Divisible By Last Digit 1. 解題思路 這一題的話我們走的是一個累積數組的思路。 首先,我們使用一個cache數組記錄下任意段數字…

三維模擬-機械臂自翻車

機械仿真 前言效果圖后續 前言 最近在研究Unity機械仿真,用Unity實現其運動學仿真展示的功能,發現一個好用的插件“MGS-Machinery-master”,完美的解決了Unity關節定義缺少液壓缸伸縮關節功能,內置了多個場景,講真的&…

USB子系統學習(四)用戶態下使用libusb讀取鼠標數據

文章目錄 1、聲明2、HID協議2.1、描述符2.2、鼠標數據格式 3、應用程序4、編譯應用程序5、測試6、其它 1、聲明 本文是在學習韋東山《驅動大全》USB子系統時,為梳理知識點和自己回看而記錄,全部內容高度復制粘貼。 韋老師的《驅動大全》:商…

2月9日QT

優化登錄框: 當用戶點擊取消按鈕,彈出問題對話框,詢問是否要確定退出登錄,并提供兩個按鈕,yes|No,如果用戶點擊的Yes,則關閉對話框,如果用戶點擊的No,則繼續登錄 當用戶…

安卓路由與aop 以及 Router-api

安卓路由(Android Router)和AOP(面向切面編程)是兩個在Android開發中常用的概念。下面我將詳細講解這兩個概念及其在Android開發中的應用。 一、安卓路由 安卓路由主要用于在應用程序中管理不同組件之間的導航和通信。它可以簡化…

大模型賦能網絡安全整體應用流程概述

一、四個階段概述 安全大模型的應用大致可以分為四個階段: 階段一主要基于開源基礎模型訓練安全垂直領域的模型; 階段二主要基于階段一訓練出來的安全大模型開展推理優化、蒸餾等工序,從而打造出不同安全場景的專家模型,比如數據安全領域、安全運營領域、調用郵件識別領…

nexus部署及配置https訪問

1. 使用docker-compose部署nexus docker-compose-nexus.yml version: "3" services:nexus:container_name: my-nexusimage: sonatype/nexus3:3.67.1hostname: my-nexusnetwork_mode: hostports:- 8081:8081deploy:resources:limits:cpus: 4memory: 8192Mreservations…

史上最快 Python版本 Python 3.13 安裝教程

Python3.13安裝和配置 一、Python的下載 1. 網盤下載地址 (下載速度比較快,推薦) Python3.13.0下載:Python3.13.0下載地址(windows)3.13.0下載地址(windows) 點擊下面的下載鏈接&#xff0c…

Docker從入門到精通- 容器化技術全解析

第一章:Docker 入門 一、什么是 Docker? Docker 就像一個超級厲害的 “打包神器”。它能幫咱們把應用程序和它運行所需要的東東都整整齊齊地打包到一起,形成一個獨立的小盒子,這個小盒子在 Docker 里叫容器。以前呢,…

ProcessingP5js數據可視化

折線圖繪制程序設計說明 可以讀取表格數據,并轉換成折線圖,條形圖和餅狀圖,并設計了銜接動畫效果 1. 功能概述 本程序使用 Processing 讀取 CSV 文件數據,并繪制帶有坐標軸和數據點的折線圖。橫坐標(X 軸&#xff09…

使用云計算,企業的數據監管合規問題如何解決?

使用云計算,企業的數據監管合規問題如何解決? 在當今這個信息化、數字化的時代,數據無疑成為了企業最寶貴的資產之一。隨著云計算的普及,企業將大量數據存儲在云端,不僅提升了效率,也帶來了更多靈活性。然…

AWS Fargate

AWS Fargate 是一個由 Amazon Web Services (AWS) 提供的無服務器容器計算引擎。它使開發者能夠運行容器化應用程序,而無需管理底層的服務器或虛擬機。簡而言之,AWS Fargate 讓你只需關注應用的容器本身,而不需要管理運行容器的基礎設施&…

vue3+vite+eslint|prettier+elementplus+國際化+axios封裝+pinia

文章目錄 vue3 vite 創建項目如果創建項目選了 eslint prettier從零教你使用 eslint prettier第一步,下載eslint第二步,創建eslint配置文件,并下載好其他插件第三步:安裝 prettier安裝后配置 eslint (2025/2/7 補充) 第四步&am…

vLLM V1 重磅升級:核心架構全面革新

本文主要是 翻譯簡化個人評讀,原文請參考:vLLM V1: A Major Upgrade to vLLM’s Core Architecture vLLM V1 開發背景 2025年1月27日,vLLM 開發團隊推出 vLLM V1 alpha 版本,這是對框架核心架構的里程碑式升級。基于過去一年半的…

Jupyter Notebook自動保存失敗等問題的解決

一、未生成配置文件 需要在命令行中,執行下面的命令自動生成配置文件 jupyter notebook --generate-config 執行后會在 C:\Users\用戶名\.jupyter目錄中生成文件 jupyter_notebook_config.py 二、在網頁端打開Jupyter Notebook后文件保存失敗;運行代碼…

使用wpa_supplicant和wpa_cli 掃描wifi熱點及配網

一:簡要說明 交叉編譯wpa_supplicant工具后會有wpa_supplicant和wpa_cli兩個程序生產,如果知道需要連接的wifi熱點及密碼的話不需要遍歷及查詢所有wifi熱點的名字及信號強度等信息的話,使用wpa_supplicant即可,否則還需要使用wpa_…

Flink (十七) :Table API SQL (五) 時區

Flink 為日期和時間提供了豐富的數據類型, 包括 DATE, TIME, TIMESTAMP, TIMESTAMP_LTZ, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND 。 Flink 支持在 session (會話)級別設置…

【真一鍵部署腳本】——一鍵部署deepseek

目錄 deepseek一鍵部署腳本說明 0 必要前提 1 使用方法 1.1 使用默認安裝配置 1.1 .1 使用其它ds模型 1.2 使用自定義安裝 2 附錄:deepseek模型手動下載 3 腳本下載地址 deepseek一鍵部署腳本說明 0 必要前提 linux環境 python>3.10 1 使用方法 1.1 …