springboot-数据库事务支持

文章目录

    • 事务支持
      • 编程式事务管理
      • 声明式事务管理
        • 使用 `@Transactional` 注解
        • 配置事务管理器
        • `@Transactional` 的一些属性
    • isolation 事务隔离级别
    • propagation 事务传播机制

事务支持

Spring Boot 中的事务管理主要依赖于 Spring Framework 提供的功能。Spring 为事务管理提供了两种方式:编程式事务管理和声明式事务管理。在实际开发中,声明式事务管理由于其简洁性和易于使用的特点而更受欢迎。

编程式事务管理

编程式事务管理涉及到在代码中手动控制事务的开始、提交和回滚。这种方式适用于需要精确控制事务边界的情况。例如:

@Autowired
private PlatformTransactionManager transactionManager;public void doWork() {DefaultTransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {// 执行业务逻辑// ...transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}
}

声明式事务管理

声明式事务管理通过使用 XML 配置或者 @Transactional 注解来实现。这种方式更为常见,因为它简化了事务边界定义,并且不需要在每个方法中显式地管理事务。

使用 @Transactional 注解

要使用 @Transactional 注解,你需要将它应用到需要事务的方法或类上。例如:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);}
}

在这个例子中,createUser 方法会被自动包裹在一个数据库事务中。如果该方法执行过程中发生异常,则事务会自动回滚。

配置事务管理器

为了使用 @Transactional 注解,需要配置一个事务管理器。对于使用 JPA 或 Hibernate 的应用程序,通常会有一个默认的事务管理器,你可以直接使用它。

@Configuration
@EnableTransactionManagement
public class AppConfig {@Autowiredprivate DataSource dataSource;@Beanpublic PlatformTransactionManager transactionManager() {return new JpaTransactionManager(entityManagerFactory().getObject());}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();em.setDataSource(dataSource);em.setPackagesToScan("com.example.domain");return em;}
}
@Transactional 的一些属性
  • readOnly: 如果设置为 true,则表示事务是只读的,可以提高性能。但需要注意的是,如果数据库驱动不支持只读事务,则不会有任何效果。
  • propagation: 指定事务传播行为,默认是 REQUIRED,即存在事务则加入,否则新建一个事务。
  • isolation: 指定事务的隔离级别,默认是数据库的默认隔离级别。
  • timeout: 指定事务的超时时间(以秒为单位),超过这个时间则自动回滚。
  • rollbackFor: 指定导致事务回滚的异常类型列表。
  • noRollbackFor: 指定即使发生异常也不回滚的异常类型列表。

isolation 事务隔离级别

Spring Boot 支持的事务隔离级别主要有以下五种:

  1. READ_UNCOMMITTED(读未提交):这是最低的隔离级别,一个事务可以读取到另一个事务未提交的数据。这种隔离级别可能会导致脏读、不可重复读和幻读。

  2. READ_COMMITTED(读已提交):这是大多数数据库系统的默认隔离级别。在这个隔离级别下,一个事务只能读取到另一个事务已经提交的数据。这种隔离级别可以避免脏读,但仍然可能导致不可重复读和幻读。

  3. REPEATABLE_READ(可重复读):在这个隔离级别下,一个事务在整个过程中可以多次读取到相同的数据行,即使在这个事务执行过程中,其他事务对这些数据行进行了修改或插入。这种隔离级别可以避免脏读和不可重复读,但仍然可能导致幻读。

  4. SERIALIZABLE(串行化):这是最高的隔离级别,它要求事务串行执行,即一个事务在执行过程中,其他事务不能对其访问的数据进行修改。这种隔离级别可以避免脏读、不可重复读和幻读,但由于事务串行执行,会导致性能下降。

  5. DEFAULT(默认):这是 Spring Boot 默认的事务隔离级别,它的具体值取决于底层数据库系统的默认隔离级别。

在 Spring Boot 中,你可以通过 @Transactional 注解的 isolation 属性来设置事务隔离级别,例如:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void someMethod() {// ...
}

注意:不同的数据库系统可能支持的事务隔离级别有所不同,具体请参考你所使用的数据库系统的文档。

propagation 事务传播机制

Spring Boot中的事务传播机制定义了在一个方法调用另一个方法时,事务如何传播。Spring提供了7种事务传播行为,分别是:

  1. PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。

  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

  3. PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。

  4. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务。

在Spring Boot中,你可以使用@Transactional注解的propagation属性来设置事务传播机制,例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethod() {// ...
}

在这个例子中,我们将someMethod方法的事务传播机制设置为REQUIRES_NEW,这意味着每次调用这个方法时,都会创建一个新的事务,即使当前已经存在一个事务。

注意:不同的传播机制可能会导致不同的事务行为,因此在选择传播机制时需要根据具体的业务需求进行权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core 通过Sqlsugar生成实体

通过替换字符串的方式生成代码&#xff0c;其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为&#xff1a;嵌入资源 模板内容&#xff1a; using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…

重学SpringBoot3-SpringApplicationRunListener

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringApplicationRunListener 1. 基本作用2. 如何实现2.1. 创建SpringApplicationRunListener2.2. 注册SpringApplicationRunListener2.3. 完整示例 3.…

跨国公司撤出背后的启示:中国IT产业的挑战与机遇

目录 前言 1. 全球化背景下的战略调整 2. 中国IT人才的应对之策 3. 中国IT产业的机遇与挑战 4. 未来的中国IT产业&#xff1a;自主创新与全球化并行 5. 结语 相关推荐 前言 IBM中国近日宣布撤出其在华两大研发中心&#xff0c;这一决定在IT行业内引发了广泛的讨论和思考…

iceoryx共享内存通信

共享内存原理 当POSIX系统中的进程启动时,它会被赋予自己的虚拟地址空间。 虚拟地址空间跨越的范围对于不同的进程可能是相同的,但是在特定地址可访问的数据对于每个进程可能是不同的。 在进程的虚拟地址空间内,有许多“内存区域”用于加载或映射数据。这些内存区域通常是…

MacBook上怎么查找历史复制记录?

你是否经常遇到这样的情况:做内容或方案时,需要用到素材就去找,找到后回来粘贴,然后再去找,再回来粘贴?这个过程是不是很繁琐? 那么找到的素材要不要保存下来呢?每个都存成文件似乎太麻烦了。但如果不单独保存,过两天想再利用又找不到了,怎么办? 在网上看到的一段好文案、…

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

JavaScript 将 json 美化输出

https://andi.cn/page/621741.html

STM32G474RE之RTC

STM32G474RE之RTC使用HAL库实现RTC时间配置&#xff0c;以及报警配置&#xff0c;支持双路报警。 1、STM32G474RE的RTC晶振引脚&#xff1a; OSC32_IN为PC14&#xff0c;OSC32_OUT为PC15&#xff1b; 2、Vbat引脚 Vbat引脚是用来给外部晶振LSE和备份寄存器提供电源。当没有“…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…

3D Gaussian Splatting 论文学习

概述 目前比较常见的渲染方法大致可以分为2种&#xff1a; 将场景中的物体投影到渲染平面&#xff1a;传统的渲染管线就是这种方式&#xff0c;主要针对Mesh数据&#xff0c;可以将顶点直接投影成2D的形式&#xff0c;配合光栅化、深度测试、Alpha混合等就可以得到渲染的图像…

如何使用 ONNX 结合 GPU 加速推理(CUDA 与 cuDNN 简明指南)

前言 在深度学习模型推理中,使用 GPU 进行加速是提升模型推理速度的关键方式之一。 本文将带大家一步步了解如何使用 ONNX Runtime 结合 NVIDIA 的 CUDA 和 cuDNN 进行 GPU 加速。 一、查找ONNX、CUDA与cuDNN之间的对应版本 首先,我们需要确保 ONNX Runtime 与 CUDA 和 cu…

量化投资策略_因子打分选股的案例实现

一&#xff1a;因子打分选股的介绍 因子打分选股是一种量化投资策略&#xff0c;它通过选取多个与股票收益率相关的因子&#xff0c;对股票进行综合评分&#xff0c;然后根据评分来选择股票构建投资组合。以下是构建多因子打分选股模型的一般步骤&#xff1a; 数据预处理&…

Redis——常用数据类型hash

目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值&#xff1a;设置成功的键值对的个数hget HGET key field//hdel HDEL key…

【SSRF漏洞】——http协议常见绕过

改变的确很难&#xff0c;但结果值得冒险 本文如有错误之处&#xff0c;还请各位师傅指正 一.ssrf概述 SSRF全称为Server-side Request Fogery,中文含义服务器端请求伪造 SSRF是一种由攻击者构造形成由目标服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标…

Linux 防火墙:iptables (二)

文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;…

PCL 点云基于曲率大小渲染颜色

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概…

Django笔记一:搭建Django环境与URL路径访问

博主之前学从Java后端开发&#xff0c;后面获取到读研资格&#xff0c;想着未来转算法岗&#xff0c;初学Python&#xff0c;发现Python还挺有趣的&#xff0c;由于之前所学后端缘故&#xff0c;有点后端情节&#xff0c;想学习一下Django框架&#xff08;python的web框架&…

人工智能和机器学习:探讨人工智能和机器学习的最新发展、应用、挑战和未来趋势

人工智能和机器学习是当前科技领域的热点话题&#xff0c;其最新发展、应用、挑战和未来趋势备受关注。 最新发展&#xff1a; 人工智能和机器学习技术在近年来得到了快速发展&#xff0c;尤其是深度学习技术的广泛应用。例如&#xff0c;深度学习在图像识别、语音识别、自然语…

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…