springboot 事务管理

embedded/2025/2/12 2:42:59/

在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.ppmy.cn/embedded/161498.html

相关文章

软件工程-软件需求分析基础

基本任务 准确地回答“系统必须做什么?”,也就是对目标系统提出完整、准确、清晰、具体的要求 目标是,在分析阶段结束之前,系统分析员应该写出软件需求规格说明书,以书面形式准确地描述软件需求。 准则 1&#xff…

c++初始

目录 一数据类型 1. 2.sizeof 3.布尔 4.字符串类型 二.数据输入与输出 1.输出 2.输入 三.运算 1.加减乘除取模,,--都一样 2.逻辑非与或,与C语言一样 3.比较运算符,与C语言一样 4.三目运算符(与C语言一样&a…

Thymeleaf在循环时设置递增序号

场景 在使用Thymeleaf进行遍历循环时,数据前面的序号如果使用实体类的id属性,id要是不从1开始递增则不能实现计数效果。 所以需要在循环时实现一个递增的序号效果。 如果没有显示设置状态变量,thymeleaf会默 认给个“变量名Stat"的状态…

从MySQL优化到脑力健康:技术人与效率的双重提升

文章目录 零:前言一:MySQL性能优化的核心知识点1. 索引优化的最佳实践实战案例: 2. 高并发事务的处理机制实战案例: 3. 查询性能调优实战案例: 4. 缓存与连接池的优化实战案例: 二:技术工作者的…

ASAP Utilities:Excel 插件中的高效助手

Excel 是职场必备工具,但你真的用好了吗? 几乎每个职场人都离不开Excel,但很多人可能只是简单地打开文件、输入数据,对于批量处理数据等高级操作却无从下手。今天为大家介绍一款强大的 Excel 插件——ASAP Utilities,它…

rebase和merge

rebase 和merge区别: rebase变基,改变基底:rebase会抹去提交记录。 git pull 默认merge,git pull --rebase 变基 rebase C、D提交属于feature分支,是基于master分支,在B提交额外拉出来的,当…

手写一个C++ Android Binder服务及源码分析

手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…

只需三步!5分钟本地部署deep seek——MAC环境

MAC本地部署deep seek 第一步:下载Ollama第二步:下载deepseek-r1模型第三步:安装谷歌浏览器插件 第一步:下载Ollama 打开此网址:https://ollama.com/,点击下载即可,如果网络比较慢可使用文末百度网盘链接 注:Ollama是…