当前位置: 首页 > news >正文

Spring中使用嵌套事务及事务保存点

嵌套事务及事务保存点

  • Spring中的嵌套事务与事务保存点
    • 1. 什么是嵌套事务?
    • 2. 为什么使用嵌套事务?
    • 3. 如何在Spring中使用嵌套事务?
    • 4. 使用事务保存点
    • 5. 总结

Spring框架提供了强大的事务管理功能,包括对嵌套事务的支持。在Spring中使用嵌套事务时,可以利用保存点来实现更灵活的事务控制。


Spring中的嵌套事务与事务保存点

在复杂的应用程序中,事务管理是一项重要的任务,尤其是在处理需要在多个数据库操作之间保持一致性的业务逻辑时。Spring框架通过其强大的事务管理功能简化了这一过程。本文将介绍如何在Spring中使用嵌套事务以及如何结合事务保存点来实现更细粒度的事务控制。

1. 什么是嵌套事务?

嵌套事务是指在一个事务的内部又开启了一个新的事务。这种事务结构允许在主事务中进行部分提交或回滚,而不影响整个事务的结果。嵌套事务通常用于处理复杂的业务逻辑,其中包含多个阶段,每个阶段都需要自己的事务边界。

2. 为什么使用嵌套事务?

在某些情况下,一个完整的业务流程可能由多个子流程组成,每个子流程都需要自己的事务边界。例如,在电子商务应用程序中,可能有一个订单流程,其中包括库存检查、支付处理等多个步骤。在这种情况下,每个步骤都需要自己的事务来保证数据一致性。

嵌套事务提供了一种机制,可以让你在主事务中开始一个新的事务,这个新事务可以独立于主事务进行提交或回滚。这样,即使子事务失败,也不会影响到整个主事务的完整性。

3. 如何在Spring中使用嵌套事务?

在Spring中,可以通过编程式事务管理来实现嵌套事务。Spring的TransactionTemplatePlatformTransactionManager提供了创建嵌套事务的能力。

下面是一个使用TransactionTemplate实现嵌套事务的例子:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionSynchronizationManager;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;public class NestedTransactionService {@Autowiredprivate PlatformTransactionManager transactionManager;public void processOrder(Order order) {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);// 主事务transactionTemplate.execute(new TransactionCallbackWithoutResult() {protected void doInTransactionWithoutResult(TransactionStatus status) {try {// 子事务1: 库存检查checkStock(order);// 子事务2: 支付处理paymentProcess(order);} catch (Exception e) {status.setRollbackOnly();}}});}private void checkStock(Order order) {DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);TransactionStatus stockCheckStatus = transactionManager.getTransaction(def);try {// 进行库存检查// ...transactionManager.commit(stockCheckStatus);} catch (Exception e) {transactionManager.rollback(stockCheckStatus);throw e; // 传播异常给上层事务}}private void paymentProcess(Order order) {DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);TransactionStatus paymentStatus = transactionManager.getTransaction(def);try {// 进行支付处理// ...transactionManager.commit(paymentStatus);} catch (Exception e) {transactionManager.rollback(paymentStatus);throw e; // 传播异常给上层事务}}
}

在这个例子中,processOrder方法代表了主事务,而checkStockpaymentProcess则分别代表了两个子事务。每个子事务都是独立的,它们有自己的事务边界,并且可以独立地提交或回滚。

4. 使用事务保存点

除了嵌套事务之外,Spring还支持使用事务保存点来实现更细粒度的事务控制。事务保存点允许你在事务中设置一个标记,然后回滚到这个标记处,而不是回滚整个事务。

下面是如何在Spring中使用事务保存点的例子:

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionSynchronizationManager;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;public class SavepointTransactionService {@Autowiredprivate PlatformTransactionManager transactionManager;public void processOrder(Order order) {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);// 主事务transactionTemplate.execute(new TransactionCallbackWithoutResult() {protected void doInTransactionWithoutResult(TransactionStatus status) {try {// 子事务1: 库存检查checkStock(order);// 创建保存点Savepoint savepoint = ((DataSourceTransactionManager) transactionManager).getConnection().setSavepoint();// 子事务2: 支付处理paymentProcess(order);// 如果支付处理成功,则提交事务// 如果支付处理失败,则回滚到保存点if (paymentFailed) {((DataSourceTransactionManager) transactionManager).getConnection().rollback(savepoint);}} catch (Exception e) {status.setRollbackOnly();}}});}private void checkStock(Order order) {DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);TransactionStatus stockCheckStatus = transactionManager.getTransaction(def);try {// 进行库存检查// ...transactionManager.commit(stockCheckStatus);} catch (Exception e) {transactionManager.rollback(stockCheckStatus);throw e; // 传播异常给上层事务}}private void paymentProcess(Order order) {// 进行支付处理// ...}
}

在这个例子中,首先进行了库存检查,然后设置了一个保存点。接下来的支付处理如果失败,可以回滚到这个保存点,而不是回滚整个事务。

5. 总结

通过使用Spring的嵌套事务和事务保存点,可以更加灵活地控制事务的边界和行为。嵌套事务允许一个大事务分解为几个小事务,而事务保存点则允许回滚到事务中的某个特定点。这两种机制都是处理复杂业务逻辑的强大工具。

相关文章:

Spring中使用嵌套事务及事务保存点

嵌套事务及事务保存点 Spring中的嵌套事务与事务保存点1. 什么是嵌套事务?2. 为什么使用嵌套事务?3. 如何在Spring中使用嵌套事务?4. 使用事务保存点5. 总结 Spring框架提供了强大的事务管理功能,包括对嵌套事务的支持。在Spring中…...

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路

TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好,再与人类的偏好进行对齐; • SFT 只通过 LLMs 生成的下一个单词进行估计,而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计,显然后者的估计会更准确; • 虽然…...

【数据结构】LinkedList与链表

目录 链表 1、链表的概念及结构 2、LinkedList的使用 2、1什么是LinkedList 2、2LinkedList的使用 3、LinkedList的遍历 4、LinkedList的模拟实现 5、ArrayList和LinkedList的区别 上篇已经熟悉了ArrayList的使用,ArrayList底层使用数组来存储元素。由于其底层…...

《LeetCode热题100》---<5.①普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第一道:最大子数组和(中等) 第二道:合并区间(中等) 第一道:最大子数组和(中等) 法一:贪心算法 class So…...

根据id查找树形结构中匹配数据与上级所有数据

背后 在用户管理业务开发过程中,通常需要查询出用户管理的菜单数据和当前菜单的所有上级数据。为了方便后续的cv工作,我打算把这种方法记录下来,以备不时之需. 代码实现细节 Data public class MenuDTO {Schema(description "菜单id&qu…...

探索亚马逊Amazon S3:无缝存储管理与极速数据传输的奥秘

亚马逊云科技中Amazon S3,因其设计简单与高度可靠,允许用户通过互联网存储和检索任意数量的数据,并能够自动扩展以满足各种规模的需求,使得Amazon S3成为了许多云计算应用和网站的核心存储基础设施之一,Amazon S3提供的…...

Linux_监测CPU和内存

通过TOP持续获取进程的CPU和内存消耗,并写入到表格 # 配置进程名 processvm-agent # 配置次数 number100 # 配置间隔时间 time5 # csv结果文件 filecm_$(date %s).csv echo "%CPU,%MEM">${file} pid$(ps -aux | grep ${process} | awk -F {OFS"…...

OpenCV经典案例:01 答题卡识别

目录 透视变换矫正 选项识别匹配 QT 界面设计 引言:随着信息化的发展,计算机阅卷已经成为一种常规操作。在大型考试中,客观题基本不再 需要人工阅卷。本项目旨在开发一个基于OpenCV的高效答题卡识别系统,通过先进的图像处理和模…...

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么? 2、进程终止,有三种情况 3、进程如何终止? 三…...

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境,这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持,因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…...

一篇文章让你用我的世界中的红石搞懂什么是ALU!

目录 1.一些在开始的约定 2.七大逻辑门电路 1、 与门 2、 或门 3、 非门 5、 或非门 6、 异或门 7、 同或门 3.半加器 4.全加器 5.ALU 1.一些在开始的约定 相同的概念:相同的概念:高电平低电平逻辑真逻辑假 开关的开 开关的关 灯的亮 灯…...

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代,硬盘作为我们存储重要数据的核心设备,其重要性不言而喻。然而,由于各种原因,如误删除、格式化、硬盘故障等,我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全,更可能影响到我…...

基于SpringBoot+Vue的科研管理系统(带1w+文档)

基于SpringBootVue的科研管理系统(带1w文档) 基于SpringBootVue的科研管理系统(带1w文档) 科研的管理系统设计过程中采用Java开发语言,B/S结构,采取springboot框架,并以MySql为数据库进行开发。结合以上技术,对本系统的整体、数据库、功能模块…...

计算机组成原理 —— 五段式指令流水线

计算机组成原理 —— 五段式指令流水线 五段式指令流水线运算类指令LOAD指令的执行过程STORE指令的执行过程条件转移指令执行过程无条件转移指令的执行过程 我们今天来看看五段式指令流水线: 五段式指令流水线 五段式指令流水线是一种常见的处理器架构设计中采用的…...

【Bigdata】什么是关系联机分析处理

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 🎵 许飞《父亲写的散文诗》 关系联机分析处理(Relational Online Analytical Processing,简称 ROLA…...

svd在求解最小二乘中的应用

文章目录 线性最小二乘的直接解法(正规方程解法)什么是伪逆?伪逆矩阵的一般形式伪逆矩阵与SVD的关系 线性最小二乘的直接解法(正规方程解法) 对于 A x b \boldsymbol{A}xb Axb的线性最小二乘问题,有直解析…...

JVM—垃圾收集算法和HotSpot算法实现细节

参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 1、分代回收策略 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取…...

nvidia系列教程-AGX-Orin基础环境搭建

目录 前言 一、Agx-Orin(32GB)介绍 1.1 GPU 1.2 CPU 1.3 NVDLA 1.4 内存 1.5 存储 二、安装JetPack SDK 三、基础环境配置 四、jetpack软件版本 总结 前言 NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低…...

使用SpringAOP实现公共字段填充

文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表…...

c++初阶-----适配器---priority_queue

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...