Spring事务-使用@Transactional在事务中立即提交部分数据库操作

目录

一、背景

二、需求

三、Spring事务的传播级别及失效场景

1.Spring事务的传播级别

2.失效场景及正确用法


一、背景

在项目中使用数据库锁表实现分布式锁,在方法A中调用方法B,方法B是一个多节点同步的方法,内部使用写锁表的逻辑实现分布式锁,方法A是使用@Transactional标注的事务,默认情况下在调用方法B是会加入该事务,导致写锁表的操作会在方法A结束时被提交,是这显然不能满足实现分布式锁的初衷。

二、需求

在方法A的事务中,在执行到方法B的操作锁表逻辑时立即提交对数据库锁表的修改。

三、Spring事务的传播级别及失效场景

1.Spring事务的传播级别

Spring中使用@Transactional实现的声明式事务的事务传播级别可以参考以下两篇文章,这里不过多赘述。

【Spring Boot】事务的隔离级别与事务的传播特性详解:如何在 Spring 中使用事务?不同隔离级别的区别?_spring默认的事务传播级别详解-CSDN博客

Spring中事务的传播机制以及REQUIRED、REQUIRES_NEW、NESTED区别以及代码演示_requires和nested-CSDN博客

2.失效场景及正确用法

下面说明通过@Transactional设置事务传播级别的失效场景以及正确使用方式。

失效场景:调用本类对象的方法或不经Spring代理对象的方法。

正确用法:调用其他Service类对象的方法,即Spring容器管理的实例方法。

public class TestService2Impl implements TestService2 {@Autowiredprivate LockTableMapper mapper;@Autowiredprivate LogConfigurationMapper logConfigurationMapper;@Autowiredprivate TestService2Inner testService2Inner;@Override@Transactionalpublic String save(LockTable lockTable) {LogConfiguration logConfiguration = new LogConfiguration();logConfiguration.setId(UUID.randomUUID().toString().substring(0,32));//调用代理类的doLock方法,指定的事务传播级别生效。
//        String s = testService2Inner.doLock(lockTable);//调用本类的doLock方法时,指定的事务传播级别失效String s = doLock(lockTable);int insert = logConfigurationMapper.insert(logConfiguration);
//        int i = 1/0;return s;
//        return String.valueOf(insert);}@Override@Transactional(propagation = Propagation.REQUIRES_NEW)public String doLock(LockTable lockTable){log.info("call acquireLock...");String s = acquireLock(lockTable);
//        int i = 1/0;return s;}private String acquireLock(LockTable lockTable){return String.valueOf(mapper.insert(lockTable));}
}

上述例子中,save方法开启了一个默认事务,在save方法中若调用本类的doLock方法,即使该方法使用@Transactional(propagation = Propagation.REQUIRES_NEW)标注了事务的传播级别也不会生效。

若调用TestService2Inner对象的doLock方法则会生效,因为TestService2Inner对象时通过Spring容器管理的对象,通过@Autowired注入的对象其实是该类的代理对象。而Spring的声明式事务控制就是通过代理对象实现的。

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

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

相关文章

【文献阅读】企业ESG表现与创新——来自A股上市公司的证据

企业ESG表现与创新——来自A股上市公司的证据 1.引言 第一段——背景介绍 可持续发展 碳达峰、碳中和 ESG既是从微观层面解决全球性社会问题的必要,也是实现我国经济转型、促进高质量发展的有效手段。 2017.12证监会:重点排污企业的环境披露 2021.6证监…

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器(ICSR)Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…

第十五篇:全面防护:构建不容侵犯的数据库安全策略与实战指南

全面防护:构建不容侵犯的数据库安全策略与实战指南 1. 引言:数据库安全的现代战略 1.1 简介:数据库安全在当今的数字化时代中的重要性 在数字化的浪潮中,数据已成为企业乃至国家的核心资产,其价值不亚于实体世界的黄…

第五百零三回

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容,本章回中将介绍使用get进行路由管理.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Kubernetes(k8s)的Network Policies解析

目录 1.关键特性2.示例配置3.最佳实践4.注意事项 Kubernetes(k8s)的Network Policies是一种资源对象,用于定义Pod之间的网络通信规则,以此来控制和隔离集群内部的网络流量。这为Kubernetes集群提供了更细粒度的网络安全控制能力。…

RAG应用中的路由模式

依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…

spring注解使用(例子)

Dao层: 接口: public interface UserDao {public void save(); } 实现类: Component //声明为组件(关键) public class UserDaoIim implements UserDao {Overridepublic void save() {System.out.println("sa…

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗?如何避免灾难遗忘大模型的幻觉问题微调后的输出…

戴尔数据泄露影响近五千万用户,数据保护应该得到重视

据BleepingComputer报道,电脑制造商戴尔因网站漏洞遭黑客入侵,约4900万用户信息疑遭泄露。根据黑客发布的销售帖子,泄露数据最多的前五个国家分别是美国、中国、印度、澳大利亚和加拿大。 据BleepingComputer报道,电脑制造商戴尔因…

Nios实验使用串口输出“Hello Nios-II”字符到笔记本电脑

目录 实验过程 创建工程 修改程序 编译工程 运行项目 效果实现 总结 参考 实验过程 硬件设计见博主上篇博客 软件部分设计 下面使用 Nios II Software Build Tools for Eclipse 来完成当前项目的软件开发。 启动 Nios II SBT 按照下图所示点击 Nios II Software Build…

Swift—手写防抖、手写图片预加载与多张图片拼接

什么是防抖,为什么要防抖? 比如我们在文档在线编辑中修改文档内容,总不能打一个字就发送一次更新请求吧,用户疯狂点击一个按钮,总不能一直触发按钮的逻辑吧。防抖被用于避免频繁触发的事件。 Swift实现防抖代码&…

Cocos Creator 3.8.x报错:5302

在小游戏加载某个bundle后,如果报以下错误: 5302:Can not find class %s 说明bundle中某个预制件*.prefab引用了未加载的bundle的资源。 解决方法有两个: 1、将引用的资源移到预制件*.prefab相同的bundle下; 2、将…

编码器介绍与应用

一.概述 1.编码器 编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。其可和电机组装到一起用,反馈电机方向、转换角度的,然后电机…

对语言模型的通用声学攻击

对语言模型的通用声学攻击主要涉及到通过生成对抗性扰动来干扰或欺骗语音识别系统。这种攻击可以通过多种方式实现,包括但不限于基于深度学习的方法和特定的攻击策略。 通用音频对抗性扰动生成器(UAPG)是一种有效的工具,它能够在任…

数据结构——循环队列(数组)

一、循环队列的定义 二、循环队列图示 三、循环队列使用规则 为解决队满和队空的判断条件相同。 我们 采用 损失一个单元不用的方法 即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满(front指向空的单元) 这样循环队列的队满条件就变…

Spring框架深度解析:打造你的Java应用梦工厂

想要在Java企业级应用开发中大展身手?Spring框架的核心容器是你不可或缺的伙伴! 文章目录 一. 引言1.1 介绍Spring框架的重要性1.2 阐述核心容器在Spring框架中的作用1.3 故事开端 二. 背景介绍2.1 描述Spring框架的发展历程2.2 概述Spring框架的主要特点…

汇昌联信:拼多多入驻条件是哪些?

在电商领域,拼多多以其独特的团购模式迅速崛起,吸引了众多商家的目光。想要在拼多多上开店,了解其入驻条件是必不可少的第一步。下面将详细解读拼多多的入驻条件,帮助有意加入的商家们做好准备。 一、企业资质要求 想要成功入驻拼…

Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务

在 CentOS 7 上部署 ASP.NET Core 应用程序并配置 Nginx 作为反向代理服务器以及 Supervisor 作为守护服务涉及几个步骤。以下是详细的步骤指南: 1. 安装 .NET Core SDK 首先,你需要在 CentOS 7 上安装 .NET Core SDK。你可以从 Microsoft 的官方文档中…

vmware16下的ubuntu使用记录

设置ubuntu共享文件夹 cd /mnt/hgfs/ ls ls (列出当前目录下的文件的名字)(路径就是路径下的文件名字) windows传文件到linux 共享文件夹 复制文件到LinuxShare文件夹 拖拽文件 添加成功 拍摄快照 用于恢复之前某个时间点的状态

Java抽象类:为何它是你代码架构的基石?

目录 1、抽象类的概念 2、抽象类语法 3、抽象类特性 4、抽象类的作用 5、 完结散花 个人主页:秋风起,再归来~ 文章专栏:javaSE的修炼之路 个人格言:悟已往之不谏,知来者犹可追 克…