SpringBoot 中 @Transactional 的使用
SpringBoot 中 @Transactional 的使用
- 一、@Transactional 的基本使用
- 二、@Transactional 的核心属性
- 三、使用避坑(失效场景)
- 3.1 自调用问题
- 3.2 异常处理不当
- 3.3 类未被 Spring 管理
- 3.4 异步方法内使用失效
- 四、工作实践
- 4.1 事务提交之后执行一些操作
- 4.2 事务 + 分布式锁的场景(先提交事务?先释放锁?)
在 Spring Boot
开发中,@Transactional
注解是实现数据库事务管理的重要工具,它能确保数据操作的原子性、一致性、隔离性和持久性(ACID
)。本文将深入探讨@Transactional
的使用,从基础概念到实战案例,再到常见的使用陷阱和工作实践。
如果对@Transactional
的实现原理感兴趣,可以参考这篇文章:【SpringBoot + MyBatis 事务管理全解析:从 @Transactional 到 JDBC Connection 的旅程】
一、@Transactional 的基本使用
@Transactional
注解可以应用在类或方法上,用于声明该类或方法需要进行事务管理。
当@Transactional
注解标注在类上时,该类中的所有公共方法都会被纳入事务管理;当标注在方法上时,仅对该方法进行事务管理。
在 Spring Boot
项目中,首先确保在启动类上添加了@EnableTransactionManagement
注解,开启事务管理功能。例如:
@SpringBootApplication
@EnableTransactionManagement
public class YourApplication {public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}
}
然后在需要事务管理的 Service
类或方法上添加@Transactional
注解,如下:
@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}@Transactionalpublic void createUser(User user) {userRepository.save(user);// 假设这里还有其他数据库操作// 如果任何操作失败,整个事务将回滚}
}
上述代码中,createUser
方法被@Transactional
注解修饰,当执行该方法时,如果userRepository.save(user)
或后续的数据库操作抛出异常,整个方法的操作都会回滚,保证数据的一致性。
二、@Transactional 的核心属性
@Transactional
注解有多个核心属性,了解它们可以更灵活地控制事务行为,以下是主要属性及其默认值:
propagation
:事务传播行为,定义了被调用方法的事务边界。默认值为Propagation.REQUIRED
。常见取值及含义如下:Propagation.REQUIRED
:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。这是最常用的传播行为Propagation.REQUIRES_NEW
:创建一个新事务,如果当前存在事务,则将当前事务挂起。新事务独立于当前事务,不受其影响Propagation.SUPPORTS
:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行Propagation.MANDATORY
:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常Propagation.NOT_SUPPORTED
:以非事务方式执行,如果当前存在事务,则将当前事务挂起Propagation.NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常Propagation.NESTED
:如果当前存在事务,则创建一个嵌套事务执行;如果当前没有事务,则创建一个新事务。嵌套事务是一个子事务,它的提交和回滚不会影响外部事务,但外部事务回滚会导致嵌套事务回滚
-
isolation
:事务隔离级别,用于解决事务并发访问时可能出现的问题(如脏读、不可重复读、幻读)。默认值为Isolation.DEFAULT
,即使用数据库默认的隔离级别(如MySQL
默认的REPEATABLE_READ
)。常见取值及含义如下:Isolation.DEFAULT
:使用数据库默认的隔离级别。Isolation.READ_UNCOMMITTED
:最低的隔离级别,允许读取未提交的数据,可能会出现脏读、不可重复读和幻读。Isolation.READ_COMMITTED
:只允许读取已提交的数据,可以避免脏读,但可能会出现不可重复读和幻读。Isolation.REPEATABLE_READ
:在一个事务内,多次读取同一数据时结果一致,可以避免脏读和不可重复读,但可能会出现幻读。Isolation.SERIALIZABLE
:最高的隔离级别,通过强制事务串行执行,避免了所有并发问题,但性能开销最大。
-
timeout
:事务的超时时间,单位为秒。如果事务执行时间超过该值,将自动回滚。默认值为 -1,表示事务没有超时限制 -
rollbackFor
:指定需要回滚的异常类型数组。只有当方法抛出的异常属于指定的异常类型时,事务才会回滚。默认情况下,只有运行时异常(RuntimeException
及其子类)和错误(Error及其子类)会导致事务回滚 -
noRollbackFor
:指定不需要回滚的异常类型数组。当方法抛出的异常属于指定的异常类型时,事务不会回滚
Propagation.REQUIRED
与Propagation.REQUIRES_NEW
的区别及案例
Propagation.REQUIRED
和Propagation.REQUIRES_NEW
是最容易混淆的两个传播行为,通过以下示例来理解它们的区别。
假设我们有两个 Service
方法:methodA
和methodB
,methodA
调用methodB
使用 Propagation.REQUIRED
:
@Service
public class TransactionService {private final AnotherService anotherService;public TransactionService(AnotherService anotherService) {this.anotherService = anotherService;}@Transactional(propagation = Propagation.REQUIRED)public void methodA() {try {// 保存数据A// 假设这里执行成功// 调用methodBanotherService.methodB();// 模拟抛出异常throw new RuntimeException("methodA error");} catch (Exception e) {// 捕获异常}}
}@Service
public class AnotherService {private final SomeRepository someRepository;public AnotherService(SomeRepository someRepository) {this.someRepository = someRepository;}@Transactional(propagation = Propagation.REQUIRED)public void methodB() {// 保存数据B// 假设这里执行成功}
}
在上述代码中,methodA
和methodB
的传播行为都为Propagation.REQUIRED
。当methodA
调用methodB
时,methodB
加入到methodA
的事务中。由于methodA
后续抛出了异常,整个事务回滚,数据 A 和数据 B 都不会被保存到数据库。
使用 Propagation.REQUIRES_NEW
:
@Service
public class TransactionService {private final AnotherService anotherService;public TransactionService(AnotherService anotherService) {this.anotherService = anotherService;}@Transactional(propagation = Propagation.REQUIRED)public void methodA() {try {// 保存数据A// 假设这里执行成功// 调用methodBanotherService.methodB();// 模拟抛出异常throw new RuntimeException("methodA error");} catch (Exception e) {// 捕获异常}}
}@Service
public class AnotherService {private final SomeRepository someRepository;public AnotherService(SomeRepository someRepository) {this.someRepository = someRepository;}@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() {// 保存数据B// 假设这里执行成功}
}
这里methodB
的传播行为为Propagation.REQUIRES_NEW
,当methodA
调用methodB
时,methodB
会创建一个新的独立事务。即使methodA
后续抛出异常导致自身事务回滚,methodB
的事务已经提交,数据 B 会被成功保存到数据库。
三、使用避坑(失效场景)
在使用@Transactional
注解时,存在一些常见的失效场景,需要特别注意:
3.1 自调用问题
自调用问题:在同一个类中,一个方法调用另一个被@Transactional
注解的方法时,事务不会生效。这是因为 Spring
的事务管理是基于代理实现的,自调用时方法并没有通过代理对象调用,所以事务不会起作用。
@Service
public class SelfCallService {@Transactionalpublic void outerMethod() {innerMethod();// 模拟抛出异常throw new RuntimeException("outerMethod error");}@Transactionalpublic void innerMethod() {// 数据库操作}
}
上述代码中,outerMethod
调用innerMethod
,由于是自调用,innerMethod
的事务不会生效。当outerMethod
抛出异常时,innerMethod
中的数据库操作不会回滚。解决方法是将被调用的方法抽取到另一个类中,通过依赖注入的方式调用。
3.2 异常处理不当
异常处理不当:如果在被@Transactional
注解的方法中捕获了异常,并且没有重新抛出运行时异常或错误,事务不会回滚。因为 Spring
默认只有在抛出运行时异常或错误时才会触发事务回滚。
@Service
public class ExceptionService {private final SomeRepository someRepository;public ExceptionService(SomeRepository someRepository) {this.someRepository = someRepository;}@Transactionalpublic void handleException() {try {// 数据库操作// 假设这里抛出异常someRepository.save(new SomeEntity());} catch (Exception e) {// 捕获异常但未重新抛出// 事务不会回滚}}
}
解决方法是在捕获异常后,根据业务需求重新抛出运行时异常或合适的异常类型,以触发事务回滚。
3.3 类未被 Spring 管理
类未被 Spring 管理:如果使用@Transactional
注解的类没有被 Spring
容器管理(例如没有添加@Component
、@Service
等注解),事务不会生效。因为 Spring
无法为其创建代理对象来管理事务。
3.4 异步方法内使用失效
异步方法内使用失效:在异步方法(使用@Async
注解)内使用@Transactional
注解,事务可能不会生效。这是因为异步方法是在另一个线程中执行,脱离了原有的事务上下文。如果需要在异步方法中使用事务,需要特殊处理,例如通过传递事务管理器等方式。
四、工作实践
4.1 事务提交之后执行一些操作
事务提交之后执行一些操作:在某些场景下,需要在事务提交之后执行一些操作,例如发送消息通知、更新缓存等。可以使用TransactionSynchronizationManager
来实现
假设我们有一个订单处理系统,在订单创建事务提交后,需要异步发送通知邮件。我们可以通过 TransactionSynchronization
接口监听事务状态,并在事务提交后执行邮件发送任务。
示例代码:
@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;@Autowiredprivate EmailService emailService;@Transactionalpublic void createOrder(Order order) {// 保存订单到数据库orderRepository.save(order);// 注册事务同步器,监听事务状态TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {// 事务提交后执行的操作emailService.sendOrderConfirmation(order.getId());}@Overridepublic void afterCompletion(int status) {// 事务完成后执行的操作(无论提交还是回滚)if (status == STATUS_COMMITTED) {// 事务已提交} else if (status == STATUS_ROLLED_BACK) {// 事务已回滚}}});// 其他业务逻辑...}
}@Service
public class EmailService {@Async // 异步方法public void sendOrderConfirmation(Long orderId) {// 模拟发送邮件System.out.println("异步发送订单确认邮件,订单ID: " + orderId);// 实际实现可能调用邮件服务API}
}
4.2 事务 + 分布式锁的场景(先提交事务?先释放锁?)
在高并发业务场景下,如电商系统的订单创建、金融系统的转账操作等,分布式锁与事务的协同使用至关重要。若锁释放与事务提交顺序不当,极易引发数据不一致问题。以下通过订单创建场景,详细说明正确的处理方式。
错误处理方式:先解锁 再 提交事务
@Service
public class OrderServiceWrong {@Transactionalpublic void createOrderWrong(String orderNo, double amount) {String lockValue = lock(orderNo); // 加锁try {if (orderMapper.existsByOrderNo(orderNo)) {return;}orderMapper.insert(new Order(orderNo, amount));} finally {// 错误:先释放锁,事务可能未提交unLock(orderNo, lockValue);}}
}
在上述代码中,若线程 A 获取锁并完成订单创建操作后,先执行了锁释放逻辑。此时,若事务提交因网络延迟等原因未完成,线程 B 可能获取到锁并再次执行订单创建逻辑,导致订单重复创建,破坏数据一致性。
正确处理方式一:事务方法外部释放锁
@Service
public class OrderServiceCorrect2 {public void createOrderCorrect2(String orderNo, double amount) {String lockValue = lock(orderNo); // 加锁try {// 调用带事务的方法boolean success = createOrderInTransaction(orderNo, amount);} catch (Exception e) {// ...} finally {unLock(orderNo, lockValue); // 释放锁}}@Transactionalpublic boolean createOrderInTransaction(String orderNo, double amount) {if (orderMapper.existsByOrderNo(orderNo)) {return false;}orderMapper.insert(new Order(orderNo, amount));return true;}
}
正确处理方式二:使用 TransactionSynchronizationManager
@Service
public class OrderServiceCorrect1 {@Transactionalpublic void createOrderCorrect1(String orderNo, double amount) {String lockValue = lock(orderNo); // 加锁try {if (orderMapper.existsByOrderNo(orderNo)) {return;}orderMapper.insert(new Order(orderNo, amount));// 在事务上下文中注册同步器,确保锁在事务提交后释放TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCompletion(int status) {if (status == STATUS_COMMITTED) {unLock(orderNo, lockValue); // 事务提交后释放锁}}});} catch (Exception e) {// 异常处理逻辑unLock(orderNo, lockValue); // 发生异常时直接释放锁throw e;}}
}
结束,✿✿ヽ(°▽°)ノ✿ !!!
相关文章:
SpringBoot 中 @Transactional 的使用
SpringBoot 中 Transactional 的使用 一、Transactional 的基本使用二、Transactional 的核心属性三、使用避坑(失效场景)3.1 自调用问题3.2 异常处理不当3.3 类未被 Spring 管理3.4 异步方法内使用失效 四、工作实践4.1 事务提交之后执行一些操作4.2 事…...
Mac电脑安装iTerm2通过rz命令上传文件到远程服务器
背景 闲着没事买了个云服务器玩(京东云轻量云主机),Mac本地搞了个java的jar包,想上传到云服务器,通过scp命令在Mac自带的【终端】上怎么都上传不了,如图。但是通过ssh命令(ssh root主机IP &…...
供应链数据可视化大屏
在全球化与数字化转型的双重浪潮下,供应链管理正面临前所未有的挑战:黑天鹅事件频发、多环节协同效率低下、库存与成本难以平衡……如何让供应链更透明、更敏捷、更具韧性?供应链数据可视化大屏应运而生,成为企业破解管理痛点的关…...
A2O MAY登上央视《中国音乐TOP榜》舞台,展现新歌榜冠军实力
——A2O MAY凭借新歌《BOSS》登上中国QQ音乐新歌榜冠军后,成功出演CCTV音乐节目《中国音乐TOP榜》,以实力赢得瞩目。 由A2O Entertainment(以下简称A2O)推出的全球女团 A2O MAY(成员包括朱晨予CHENYU、李诗洁SHIJIE、…...
关于如何在 Git 中切换到之前创建的分支的方法
文章目录 关于如何在 Git 中切换到之前创建的分支的方法一、确保你在项目目录中二、查看所有分支(可选)三、切换到目标分支四、如果分支仅在远程存在五、验证是否切换成功六、常见问题处理七、总结命令流程 PS:下次进入分支时,只需完成步骤1 …...
vue3+element-plus 组件功能实现 上传功能
一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(…...
多相机人脸扫描设备如何助力高效打造数字教育孪生体?
在教育数字化转型浪潮中,数字孪生体作为现实教育场景的虚拟映射,正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点,而数字孪生体通过构建高仿真虚拟教育主体(…...
高中成绩可视化平台开发笔记
高中成绩可视化平台(1) 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台,旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换,并提供多个维度的图…...
圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; [assembly: CommandClass(typeof(IfoxDemo.Commands))] namespace IfoxDemo {// 新增的圆形闪烁命令实…...
Spark SQL to_json 函数介绍
目录 前言函数介绍参数说明示例 前言 在Apache Hive中,并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据(如结构化类型或MAP类型)转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…...
5个免费的硬盘分区工具,操作简单功能全
电脑用久了,系统盘空间告急、数据盘混乱无序,很多人想重新分区,却又担心太复杂或怕搞坏硬盘。其实,只要用对工具,分区操作其实一点都不难。更重要的是,有很多免费的分区软件,不仅好用࿰…...
uniapp事件onLoad区分大小写
区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分...
Flutter Riverpod 使用详细解析
📚 Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解:原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…...
算法打卡 day4
4 . 高精度算法 性质:数组或者容器从低位往高位依次存储大整数,方便进位。 4.1 高精度加法 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,…...
权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”
近日,华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证,获得了IT产品信息安全认证证书。此次获证,标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平,可以为政企…...
【Linux网络编程】多路转接IO(二)epoll
目录 epoll初识 epoll的相关系统调用 epoll的工作原理 epoll的优点 epoll的工作方式 水平触发 Level Triggered 工作模式 边缘触发 Edge Triggered 工作模式 对比LT和ET 理解 ET 模式和非阻塞文件描述符 epoll的惊群问题 基于LT模式的epoll代码样例 epoll初识 按照man…...
flutter的包管理#资源管理#调试Flutter应用#Flutter异常捕获
2.5 包管理 2.5.1 简介 在软件开发中,很多时候有一些公共的库或 SDK 可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率。很多编程语言或开…...
Unity Netcode自定义数据传输——结构体及其序列化
在 Unity Netcode 中,要实现自定义数据的网络传输,确实需要两个关键部分: ✅ 两个必需组件: 数据结构定义 public struct PlayerState : INetworkSerializable {public int id; // 字段1:玩家IDpublic bool …...
Vue 3 高级编程技巧
Vue 3 高级编程技巧 1. 计算属性 (Computed Properties) 含义:计算属性在依赖变化时会自动更新。以下是一个示例,展示当 firstName 或 lastName 变化时,fullName 也会更新。 实例: <script setup> import { ref, comput…...
GraphQL注入 -- GPN CTF 2025 Real Christmas
part 1 服务器会每段时间禁用已注册的账号,此处存在漏洞 def deactivate_user_graphql(email):graphql_endpoint current_app.config["GRAPHQL_ENDPOINT"]query f"""mutation {{deactivateUser (user: {{email: "{email}"}}){{ success…...
python打卡day43
疏锦行 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 数据预处理 tra…...
ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理
下面是一个完整的 Ethers.js Express Vue2 MySQL 实现方案,用于: 💡每天凌晨 2 点监听某合约地址的 Transfer 事件,写入 MySQL 数据库,并展示每日 NFT 交易量图表(Vue2 ECharts) ✅ 后端部分…...
内网穿透和端口映射的区别在哪?局域网提供互联网访问方案对比选择详解
内网穿透和端口映射是两个经常被提及的概念,它们对于实现网络中的内外网通信起着关键作用。内网穿透和端口映射都能够有效地将本地局域网地址提供给互联网上外网访问,但二者之间存在着显著的区别。 内网穿透与端口映射的核心区别在于实现方式和依赖条件…...
机器学习---正则化、过拟合抑制与特征筛选
专栏:机器学习 个人主页:云端筑梦狮 注:上一篇机器学习还差一小节,日后坑必会填上 一.正则化 什么是正则化 / 如何进行正则化 其实机器学习中正则化(regularization)的外在形式非常简单,就是在模型的损失函数中加…...
优化 ArcPy 脚本性能
合理设置环境变量 优化环境变量配置 ArcPy 提供了许多环境变量,用于控制地理处理工具的行为。合理设置环境变量可以优化脚本的性能。例如,设置“workspace”环境变量可以指定默认的工作空间,避免在脚本中重复指定工作空间路径。 Python 复制…...
Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理
使用WebSocket实现产品智能助理 WebSocket原理与应用场景Robyn的WebSocket基本使用1、创建WebSocket服务2、侦听WebSocket事件3、向客户端发送消息4、向客户端广播消息5、使用查询参数6、主动关闭连接 示例:简易的产品智能助理1、产品数据部分2、产品信息部分3、智能…...
UDP 缓冲区
UDP 有接收缓冲区,没有发送缓冲区 引申问题 1、为什么没有发送缓冲区? 直接引用原文 “因为 UDP 是不可靠的,它不必保存应用进程的数据拷贝,因此无需一个真正的发送缓冲区” 2、没有发送缓冲区的情况下,sendto 的数…...
物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
在数字化浪潮席卷全球的今天,物联网(IoT)已从概念走向现实,成为连接物理世界与数字世界的关键桥梁。它通过将日常物品、工业设备等“物”嵌入传感器、软件及其他技术,使其能够通过网络相互连接并交换数据,从…...
【甲方安全视角】开源的安全悖论
文章目录 安全的充分必要条件:从「符号化信任」到「验证驱动安全」构建与分发的不可信链条迭代与审计的节奏错位代码透明与攻击面的对等暴露对普通用户的建议选择可信项目与品牌始终通过官方渠道获取软件注意权限与环境安全对“签名请求”、“连接钱包”等敏感操作保…...
GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
在人工智能技术浪潮的推动下,GEO生成式引擎优化已跃升为行业技术演进与产业发展相融合的核心赛道。通过系统性梳理其发展脉络,我们可清晰勾勒出技术突破与产业变革交织的演进轨迹,其发展进程包含以下重要节点。 2023年4月,GPT-4发…...
【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)
注意:考虑到热更新的内容比较多,我将热更新的内容分开,并全部整合放在【unity游戏开发——网络】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、数据管理模型1、分散式 (Decentralized - 各管各的)2、集中式 (Centra…...
MR30分布式 IO在物流堆垛机的应用
在现代物流行业蓬勃发展的浪潮中,物流堆垛机作为自动化仓储系统的核心设备,承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势,极大地提升了仓储空间利用率和货物周转效率。然而,随着物流行业的高速发展&#…...
香港维尔利健康科技集团推出AI辅助医学影像训练平台,助力医护人才数字化转型
香港维尔利健康科技集团近日正式发布其自主研发的“AI辅助医学影像训练平台(V-MedTrain)”,这一创新平台的上线,标志着医学影像教育迈入智能化辅助教学新时代。依托人工智能与大数据分析技术,香港维尔利健康科技集团在…...
2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)
2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五) 第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应(可以培训有答案)任务 2:通信数据分析取…...
基于 Python 的批量文件重命名软件设计与实现
在工作过程中,经常有很多文件,想要对文件名进行批量改名,特此写了一个程序,以实现此功能。 一、批量文件重命名软件设计原理 (一)核心原理阐述 批量文件重命名软件的核心原理在于运用操作系统提供的文件管理功能,借助编程手段达成对文件名称的批量修改。在这个软件里,…...
【深度学习新浪潮】什么是上下文工程?
什么是上下文工程? 上下文工程(Context Engineering) 是指通过设计、优化与大语言模型(LLM)交互时的输入内容(即“上下文”),引导模型生成更符合预期、更精准回答的系统性方法。这里的“上下文”通常包括 提示词(Prompt)、示例(Few-Shot Examples)、历史对话记录、…...
逆向入门(8)汇编篇-rol指令的学习
还是那个题,这回又碰到个循环左移,有挺多操作方法之前都没有系统的学,用到的时候再看看感觉还挺好,不耽误事 0x00 基本介绍 ROL(Rotate Left): 循环左移,它有两个操作数: 第一个操作数是目标操作数&#…...
Fisco Bcos学习 - 开发第一个区块链应用
文章目录 一、前言二、业务场景分析:简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...
黑马python(十六)
目录: 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站: 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...
完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台
小T导读:昆明卷烟厂作为红云红河烟草(集团)有限责任公司的重要组成部分,是集团卷烟生产的核心工厂。早期在建设制造执行系统(MES)时,其采用了 Wonderware 平台的时序数据存储功能模块࿰…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)
📅 我们继续 50 个小项目挑战!—— BackgroundSlider组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...
Wpf的Binding
前言 wpf的Binding就像一个桥梁,它的作用就是连接逻辑层与界面层,既能够把逻辑层的数据搬到界面层展示,又能将界面层的数据更改后传递到逻辑层,Binding的数据来源就是Binding的源,数据展示的地方就是Binding的目标。 …...
Redis—持久化
持久化 在mysql当中,有4个比较关心的特性,分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢?答案就是看重启进程或者主机之后,数据是否存在。当我们把数据存储在硬盘上是就…...
Spring Boot中日志管理与异常处理
以下是Spring Boot中日志管理与异常处理的系统化实践指南,结合最佳实践与核心配置,确保应用健壮性与可维护性。 📊 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架,通过application.yml快速配置&…...
基于MATLAB的BP神经网络的心电图分类方法应用
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图(ECG)是临床诊断心血管疾病的重要工具,能够反映心脏电活动的周期性变化。…...
【笔记】Docker 配置阿里云镜像加速(公共地址即开即用,无需手动创建实例)
2025年06月25日记 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)-CSDN博客 【笔记】解决 WSL 迁移后 Docker 出现 “starting services: initializing Docker API Proxy: setting up docker ap” 问题…...
Java 中LinkedList 总结
406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高…...
微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)
目录 理解page-container的原理 设置禁止点击遮盖层关闭? 阻止左滑返回 理解page-container的原理 page-container组件的所有属性,最重要的是show值。在页面上引入这个组件后,若show值为true,页面上所有各种方式触发的返回操作…...
Linux基本指令篇 —— mv指令
在Windows中我们经常使用CtrlX和CtrlV将一个地方的文件或目录移动到另一个地方,我们若是要在Linux当中完成此操作,则需要使用mv指令。mv 是 Linux 系统中用于移动或重命名文件和目录的基本命令之一,是 "move" 的缩写。下面将详细介…...
基于STM32的智能节能风扇的设计
基于STM32的智能节能风扇的设计 内容:1.摘要 本设计旨在解决传统风扇能耗高、功能单一的问题,提出一种基于STM32的智能节能风扇。通过结合温度传感器、人体红外传感器等多种传感器,利用STM32微控制器实现对风扇的智能控制。经过实际测试,该智…...