RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
1. @GlobalTransactional
和 @Transactional
是否冲突?
答:不冲突,它们可以协同工作,但作用域不同。
@Transactional
: 这是 Spring 提供的注解,用于管理单个数据源内的本地事务。在你当前的register
方法中,它确保了userRepository.save(user)
操作要么成功提交到auth_service_new
的数据库 (mall_auth_new
),要么在发生异常时回滚(比如数据库连接失败、约束冲突等)。它只关心本服务内的数据库操作原子性。@GlobalTransactional
: 这是 Seata 提供的注解,用于开启一个分布式全局事务。它的目的是协调跨多个服务、多个数据源的操作,保证这些操作要么全部成功,要么全部回滚。Seata 的 AT 模式(你目前可能使用的模式,因其最简单)通过代理数据源 (DataSourceProxy
) 自动记录 SQL 执行前后的镜像,并在需要时生成反向 SQL 来实现回滚。
如何协同? Seata AT 模式下的分支事务实际上是基于本地事务的。当 @GlobalTransactional
存在时,Seata 会拦截 @Transactional
管理的本地事务的提交/回滚。
- 本地事务提交时:Seata RM (Resource Manager) 会先向 TC (Transaction Coordinator) 注册分支,报告本地事务执行成功(Phase 1),但不会立即真正提交物理数据库连接。它会等待 TC 的统一指令。
- 全局事务提交时:TC 通知所有 RM 提交分支事务(Phase 2),这时 RM 才提交本地事务对应的物理数据库连接。
- 全局事务回滚时:TC 通知所有 RM 回滚分支事务(Phase 2),RM 会根据之前记录的 Undo Log 生成反向 SQL 来回滚本地数据库的更改。
结论:同时使用两者是常见且必要的。@Transactional
保证本地操作的原子性,而 @GlobalTransactional
则将这种原子性扩展到分布式环境下的多个参与者。
2. Seata (AT 模式) 和 RabbitMQ 是否冲突?
答:冲突!在期望跨服务数据库原子性的场景下,同步调用 Seata AT 模式和异步发送 RabbitMQ 消息是矛盾的。
-
Seata AT 模式的局限性: Seata AT 模式主要设计用于同步调用场景下的数据库操作。它无法管理消息队列(如 RabbitMQ)的操作。也就是说,Seata 不能:
- 保证消息发送成功后,如果后续全局事务需要回滚,能把消息“撤回”。
- 保证消息被消费者成功处理后,如果全局事务需要回滚,能让消费者的操作也回滚。
-
你当前代码的问题:
AuthServiceImpl.register
方法在@GlobalTransactional
内执行userRepository.save(user)
。这个操作被 Seata 纳入了全局事务分支。- 紧接着,它调用
messageService.sendUserCreatedEvent(savedUser)
发送 RabbitMQ 消息。这个发送操作本身不受 Seata 全局事务的管理。 user_moudle
中的UserEventListener
会异步地消费这个消息,并执行userService.createUserFromEvent
来写入user_moudle
的数据库 (mall_users
)。这个数据库写入操作也不在AuthServiceImpl.register
发起的那个 Seata 全局事务的范围内。
-
后果:
- 如果在发送消息之后,
AuthServiceImpl.register
方法内部(或其调用的其他同步下游服务)发生了需要全局回滚的异常,auth_service_new
数据库的User
记录会被 Seata 回滚,但 RabbitMQ 消息已经发出去了,user_moudle
仍然会收到消息并尝试创建用户,导致数据不一致(user_moudle
有用户,auth_service_new
没有)。 - 如果在
user_moudle
消费消息并写入数据库时失败,auth_service_new
的事务早已提交(因为消息是异步的),也无法回滚,同样导致数据不一致。
- 如果在发送消息之后,
结论:如果你希望 auth_service_new
写入 auth_user
表 和 user_moudle
写入 ums_user
表这两个数据库操作具有原子性(要么都成功,要么都失败),那么在 @GlobalTransactional
方法内部使用 RabbitMQ 进行跨服务通信是错误的设计。
3. 应该怎么做?
为了实现 auth_service_new
和 user_moudle
在用户注册时的数据库写入原子性,最佳实践是使用同步调用,让 user_moudle
的数据库操作也成为 Seata 全局事务的一个分支。
修改步骤:
-
在
auth_service_new
中定义 Feign 客户端调用user_moudle
:- 创建一个接口,例如
UserModuleClient.java
:
package com.mall.auth.client;import com.mall.auth.dto.UserSyncDTO; // 需要创建一个简单的DTO传递必要信息 import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody;// name 指向 user_moudle 的服务名 (spring.application.name) @FeignClient(name = "userservice", path = "/api/internal/users") // 使用内部API路径 public interface UserModuleClient {@PostMapping("/sync-create")void syncCreateUser(@RequestBody UserSyncDTO userSyncDTO); }
- 创建
UserSyncDTO.java
(可以简化RegisterRequest
或UserCreatedEvent
的字段):
package com.mall.auth.dto;import lombok.Builder; import lombok.Data;@Data @Builder public class UserSyncDTO {private Long authUserId;private String username;private String email;private String phone;// 注意:不需要传递密码,user_moudle 只存占位符 }
- 创建一个接口,例如
-
修改
AuthServiceImpl.register
方法:- 移除
messageService.sendUserCreatedEvent
调用。 - 注入并使用
UserModuleClient
进行同步调用。
// ... 其他注入 ... import com.mall.auth.client.UserModuleClient; import com.mall.auth.dto.UserSyncDTO; // ...@Service public class AuthServiceImpl implements AuthService {// ... 其他字段和构造函数 ...private final UserModuleClient userModuleClient;public AuthServiceImpl(// ... 其他参数 ...UserModuleClient userModuleClient, // 添加注入MessageService messageService) { // MessageService 仍然可以注入,但注册时不在此调用// ... 其他赋值 ...this.userModuleClient = userModuleClient;this.messageService = messageService; // 保留注入}@GlobalTransactional(name = "user-register-tx", rollbackFor = Exception.class)@Override@Transactional // 本地事务仍然需要public User register(RegisterRequest registerRequest) {log.info("开始用户注册流程 (同步事务): {}", registerRequest.getUsername());// ... (省略之前的检查逻辑) ...// 创建新用户User user = User.builder()// ... (省略属性设置) ....build();// 1. 保存到 auth_service_new 数据库 (参与 Seata 分支事务)User savedUser = userRepository.save(user);log.info("AuthService: 用户基础信息保存成功: {}", savedUser.getUsername());// 2. 同步调用 user_moudle 保存用户信息 (参与 Seata 分支事务)try {UserSyncDTO syncDTO = UserSyncDTO.builder().authUserId(savedUser.getId()).username(savedUser.getUsername()).email(savedUser.getEmail()).phone(savedUser.getPhone()).build();log.info("AuthService: 准备同步调用 UserModule 创建用户...");userModuleClient.syncCreateUser(syncDTO); // 通过 Feign 调用log.info("AuthService: UserModule 同步调用成功");} catch (Exception e) {log.error("AuthService: 同步调用 UserModule 失败: {}", e.getMessage(), e);// 抛出异常,触发 @GlobalTransactional 回滚// 注意:需要确保 Feign 客户端在调用失败时能正确抛出异常被 Seata 捕获// 可能需要配置 Feign 的 ErrorDecoderthrow new RuntimeException("同步用户模块失败,触发全局回滚", e);}// 发送消息的操作可以移到事务成功提交之后 (如果还需要的话)// 例如使用 Spring 的 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)// messageService.sendUserCreatedEvent(savedUser); // 从事务中移除return savedUser;}// ... 其他方法 ... }
- 移除
-
在
user_moudle
中添加对应的 Controller Endpoint:- 创建一个新的 Controller 或在
UserController
中添加一个内部接口(路径建议与 Feign Client 对应,如/api/internal/users
)。
package com.user.controler;import com.user.dto.UserSyncDTO; // 引入对应的 DTO import com.user.service.UserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@Slf4j @RestController @RequestMapping("/api/internal/users") // 内部调用路径 @RequiredArgsConstructor public class UserInternalController {private final UserService userService;@PostMapping("/sync-create")public ResponseEntity<Void> syncCreateUser(@RequestBody UserSyncDTO userSyncDTO) {log.info("UserModule: 收到同步创建用户请求: authUserId={}", userSyncDTO.getAuthUserId());try {// 这里需要一个类似 createUserFromEvent 的方法,但参数是 UserSyncDTO// 或者直接调用现有的 createUserFromEvent,但需要适配 DTOuserService.createUserFromSync(userSyncDTO); // 假设有这个方法log.info("UserModule: 同步创建用户成功: authUserId={}", userSyncDTO.getAuthUserId());return ResponseEntity.ok().build();} catch (Exception e) {log.error("UserModule: 同步创建用户失败: {}", e.getMessage(), e);// 抛出异常,让 Seata 感知到错误,触发全局回滚// Spring MVC 默认会将未捕获的异常转换为 500 错误,// Feign 客户端默认会将 4xx/5xx 视为异常throw new RuntimeException("创建用户记录失败", e);}} }
- 确保
user_moudle
的UserService
有一个处理UserSyncDTO
的方法,并且这个方法的数据库操作会因为配置了DataSourceProxy
而自动加入到 Seata 的全局事务中。
- 创建一个新的 Controller 或在
总结:
@GlobalTransactional
和@Transactional
不冲突,前者依赖后者。- 在期望数据库原子性的场景下,Seata AT 与异步消息(RabbitMQ)冲突。
- 最佳实践:将跨服务需要原子性的数据库操作改为同步 RPC 调用 (如 Feign),并在调用发起方的方法上使用
@GlobalTransactional
。移除事务内的异步消息发送。
这样修改后,用户注册时对两个数据库的写入就能真正实现分布式事务的原子性了。
相关文章:
RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
1. GlobalTransactional 和 Transactional 是否冲突? 答:不冲突,它们可以协同工作,但作用域不同。 Transactional: 这是 Spring 提供的注解,用于管理单个数据源内的本地事务。在你当前的 register 方法中,…...
[安全实战]逆向工程核心名词详解
逆向工程核心名词详解 一、调试与执行类 1. 断点(Breakpoint) 定义:在代码中设置标记,使程序执行到此处时暂停类型: 普通断点:通过INT3指令实现条件断点:满足特定条件时触发内存断点…...
用键盘实现控制小球上下移动——java的事件控制
本文分享Java的一个有趣小项目,实现用键盘控制小球的移动 涉及java知识点:Swing GUI框架,绘图机制,事件处理,焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…...
AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)
欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…...
BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
背景 在自动驾驶场景下,以往工作是目标检测任务用图像视角做,语义分割用BEV视角做。本文提出了BEVDet,实现了一个统一的框架,它模块化设计分为图像编码器,视角转换器,BEV编码器以及BEV空间的3D检测头。然而…...
高效获取淘宝实时商品数据:API 接口开发与数据采集实战指南
在电商行业竞争白热化的当下,实时且准确的商品数据是企业制定营销策略、优化产品布局的重要依据。淘宝作为国内头部电商平台,其海量的商品数据蕴含着巨大价值。通过 API 接口高效获取淘宝实时商品数据,成为电商从业者和开发者的必备技能。本文…...
kotlin知识体系(六) : Flow核心概念与与操作符指南
1. Flow基础概念 1.1 冷流(Cold Stream) 冷流是Flow的默认形式,其核心特点如下: • 按需触发:仅在消费者调用 collect 时开始发射数据,且每次收集都会重新执行流的逻辑(类似“单播”࿰…...
【CentOs】构建云服务器部署环境
(一) 服务器采购 2 CPU4G 内存40G 系统盘 80G 数据盘 (二) 服务器安全组和端口配置 (三) 磁盘挂载 1 登录 root 2 查看目前磁盘使用情况 df -h 3 查看磁盘挂载情况 识别哪些磁盘没挂载 fdisk -l 4 对未挂载磁盘做分区 fdisk /dev/vdb 输入m࿰…...
【AI论文】对人工智能生成文本的稳健和细粒度检测
摘要:机器生成内容的理想检测系统应该能够在任何生成器上很好地工作,因为越来越多的高级LLM每天都在出现。 现有的系统往往难以准确识别人工智能生成的短文本内容。 此外,并非所有文本都完全由人类或LLM创作,因此我们更关注部分案…...
MyFamilyTree:专业家谱族谱制作工具
MyFamilyTree 是一款专业级家谱族谱制作工具,支持 Windows 7 至 11 系统(含服务器版本)。该软件以直观的拖拽式操作为核心,支持构建多维家族树结构,并提供丰富的多媒体集成功能,便于用户记录家族成员的生…...
【统计分析120】统计分析120题分享
1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象,利用数学语言来描述他们的结构和行为,做出一些必要的假设,运用适当的数学工具,得到一个数学结论 数学模型:指的是通过抽象、简化现实世界的某些现象&am…...
【Windows10下PP-OCRv4部署指南】
Windows10下PP-OCRv4部署指南 一、环境准备 安装Visual Studio 2022 下载并安装 C桌面开发组件,确保支持MSVC编译环境。 配置系统环境变量,确保cl.exe等编译工具可用。 Python环境配置 推荐使用Conda创建虚拟环境: bash Co…...
Matlab PID参数整定和设计
1、内容简介 Matlab 206-PID参数整定和设计 可以交流、咨询、答疑 2、内容说明 略 某流量控制系统整定方法仿真(3) 摘 要:本次设计针对一个给定的流量控制系统进行仿真,已经确认该系统为简单控制系统,并且控制策略…...
【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
文章目录 一、与文件路径相关的指令0.补充知识:路径的认识1.pwd 指令2.cd 指令(含家目录的介绍) 二、创建和删除文件的指令0.补充知识:普通文件和目录文件1.touch 指令(可以修改文件的时间戳)2.mkdir 指令3…...
LLM基础-什么是Token?
LLM基础-什么是Token? 概述 Token 是大语言模型(LLM, Large Language Model)中最基本的输入单元,它是语言被模型“理解”的方式。不同于人类可以直接看懂一段自然语言文本,LLM 只能处理数字,而这些数字就…...
Few-shot medical image segmentation with high-fidelity prototypes 论文总结
题目:Few-shot medical image segmentation with high-fidelity prototypes(高精确原型) 论文:Few-shot medical image segmentation with high-fidelity prototypes - ScienceDirect 源码:https://github.com/tntek/D…...
大模型之路(day 1)
这段时间以来,全身心的投入了研究大模型,虽然还是入门,但比之前已经好了非常多了,不得不说,计算机的学习特别需要强大的自驱力和耐心,以及检索能力。知乎确实在这些知识的分享上做的比csdn好太多了 万事开…...
996引擎-拓展变量:物品变量
996引擎-拓展变量:物品变量 测试代码参考资料对于Lua来说,只有能保存数据库的变量才有意义。 至于临时变量,不像TXT那么束手束脚,通常使用Lua变量就能完成。 测试代码 -- 存:物品拓展strfunction (player)local where =...
集合框架(重点)
1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…...
IDEA在Git提交时添加.ignore忽略文件,解决为什么Git中有时候使用.gitignore也无法忽略一些文件
文章目录 一、为什么需要.gitignore文件?二、如何在IntelliJ IDEA中高效管理.gitignore文件?1:先下载这个.ignore插件2. 创建或编辑.gitignore文件3. 使用IDEA内置模板快速生成忽略规则4. 实时预览忽略效果5. 检查忽略规则是否生效6.但是一般我们更多时候…...
如何将自己封装的组件发布到npm上:详细教程
如何将自己封装的组件发布到npm上:详细教程 作为前端开发者,我们经常从npm(Node Package Manager)上下载并使用各种第三方库和组件。然而,有时候我们可能会发现自己需要的功能在npm上并不存在,或者我们希望…...
位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
目录 移位运算一些位运算的操作最短 Hamilton 路径(状态压缩dp模板,位运算) 0x是十六进制常数的开头;本身是声明进制,后面是对应具体的数; 数组初始化最大值时用0x3f赋值; 移位运算 左移 把二…...
node.js|环境部署|源码编译高版本的node.js
一、 前言 本文就如何二进制部署和源码编译安装部署node.js环境做一个简单的介绍 node的版本大体是以18版本为界限,也就是说18版本之前对glibc版本没有要求,其后的版本都对glibc版本有要求,node的版本越高,glibc需要的版本也越…...
通信安全员ABC证的考试内容包括哪些?
通信安全员 ABC 证的考试内容整体上围绕通信安全相关的法律法规、安全技术、安全管理等方面展开,但在具体侧重点上有所不同,以下是详细介绍: 通信安全基础知识 通信原理:包含模拟通信和数字通信的基本原理,如调制、解…...
Oracle--SQL基本语法
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 1、SQL语句介绍 在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给…...
windows服务器及网络:论如何安装(虚拟机)
今天我要介绍的是:在Windows中对于安装系统(虚拟机的步骤以及相关的安装事宜),事不宜迟,让我们来看看系统安装(虚拟机)是怎么操作的: 对现在来说,安装电脑系统已经是非常…...
【网络篇】从零写UDP客户端/服务器:回显程序源码解析
大家好呀 我是浪前 今天讲解的是网络篇的第四章:从零写UDP客户端/服务器:回显程序源码解析 从零写UDP客户端/服务器:回显程序源码解析 UDP 协议特性核心类介绍 UDP的socket应该如何使用:1: DatagramSocket2: DatagramPacket回…...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.23)
11.2 案例-文件上传-简介 文件上传的前端页面的代码需要放到springboot项目的static里面,也就是resource文件夹下面的static文件夹里面 服务端接收前端上传的数据,再服务端定义一个controller来接收数据,再controller中定义一个…...
提示词构成要素对大语言模型跨模态内容生成质量的影响
提示词构成要素对大语言模型跨模态内容生成质量的影响 提示词清晰度、具象性与质量正相关 限定指向性要素优于引导指向性要素 大语言模型生成内容保真度偏差 以讯飞星火大模型为实验平台,选取100名具备技术素养的人员,从提示词分类、构成要素和实践原则归纳出7种提示词组…...
浅聊docker的联合文件系统
前言: 在我们pull镜像的时候,就会发现一个神奇的地方,在将镜像pull到本地的时候它是分层下载的,如下图: 这时候我就有一个疑问,为什么是分层下载的?怎么和我们平时下载软件的时候不一样呢? 联…...
计算机视觉cv入门之Haarcascade的基本使用方法(人脸识别为例)
Haar CascadeXML特征分类器,是一种基于机器学习的方法,它利用了积分图像(或总面积)的概念有效地提取特征(例如,边缘、线条等)的数值。“级联分类器”即意味着不是一次就为图像中的许多特征应用数百个分类器,而是一对一地应用分类器…...
【NLP 62、实践 ⑮、基于RAG + 智谱语言模型的Dota2英雄故事与技能介绍系统】
羁绊由我而起,痛苦也由我承担 —— 25.4.14 英雄介绍文件: 通过网盘分享的文件:RAG 智谱语言模型的Dota2英雄故事与技能介绍系统 链接: https://pan.baidu.com/s/1G7Xo5TRvFl2BzUnE0NFaBA?pwd4d4j 提取码: 4d4j --来自百度网盘超级会员v3的…...
Keil MDK 编译问题:function “HAL_IncTick“ declared implicitly
问题与处理策略 问题描述 ..\..\User\stm32f1xx_it.c(141): warning: #223-D: function "HAL_IncTick" declared implicitlyHAL_IncTick(); ..\..\User\stm32f1xx_it.c: 1 warning, 0 errors问题原因 在 stm32f1xx_it.c 文件中调用了 HAL_IncTick(),但…...
OpenCV基础01-图像文件的读取与保存
介绍: OpenCV是 Open Souce C omputer V sion Library的简称。要使用OpenCV需要安装OpenCV包,使用前需要导入OpenCV模块 安装 命令 pip install opencv-python 导入 模块 import cv2 1. 图像的读取 import cv2 img cv2.imread(path, flag)这里的flag 是可选参数&…...
IP数据报
IP数据报组成 IP数据报(IP Datagram)是网络中传输数据的基本单位。 IP数据报头部 版本(Version) 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”,IPv6版本是“6”。 头部长度(IHL,Intern…...
视频联网平台与AI识别技术在电力行业的创新应用
一、电力行业智能化转型的迫切需求 在能源革命与数字化转型的双重推动下,电力行业正面临着前所未有的智能化升级需求。随着特高压电网的大规模建设和新能源占比的不断提高,传统的电力运维管理模式已经难以满足现代电网安全、高效运行的要求。据统计&…...
Apache Parquet 文件组织结构
简要概述 Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级…...
深度学习方向急出成果,是先广泛调研还是边做实验边优化?
目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例:本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
9、Hooks:现代魔法咒语集——React 19 核心Hooks
一、魔法咒语的本质革新 "类组件如同古老的魔杖挥舞仪式,而Hooks是新时代的无杖施法!"霍格沃茨魔法研究院的魔杖动力学教授惊叹道。React Hooks通过函数式能量场重构了魔法运作模式,让组件能量流转如尼可勒梅的炼金术。 ——以《国…...
FutureTask底层实现
一、FutureTask的基本使用 平时一些业务需要做并行处理,正常如果你没有返回结果的需求,直接上Runnable。 很多时候咱们是需要开启一个新的线程执行任务后,给我一个返回结果。此时咱们需要使用Callable。 在使用Callable的时候,…...
深入浅出:LDAP 协议全面解析
在网络安全和系统管理的世界中,LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是一个不可忽视的核心技术。它广泛应用于身份管理、认证授权以及目录服务,尤其在企业级环境中占据重要地位。本文将从基…...
学习笔记—C++—string(练习题)
练习题 仅仅反转字母 917. 仅仅反转字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。…...
论文阅读:2024 arxiv DeepInception: Hypnotize Large Language Model to Be Jailbreaker
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 DeepInception: Hypnotize Large Language Model to Be Jailbreaker DeepInception:催眠大型语言模型,助你成为越狱者 https://arxiv.org/pdf/2311.0…...
OC底层原理【一】 alloc init new
OC底层原理【一】 alloc init && new 文章目录 OC底层原理【一】 alloc init && new前言allocslowpath(checkNil && !cls)) 和 fastpath(!cls->ISA()->hasCustomAWZ())!cls->ISA()->hasCustomAWZ()) obj->initInstanceIsa();将类与isa关…...
集合框架拓展--stream流的使用
Stream(JDK8新特性) 什么是Stream? 也叫stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用于操作集合或数组中的数据 优势:Stream流大量地结合了Lambda的语法风格来编程ÿ…...
Beszel 轻量级服务器监控平台的详细安装步骤
什么是 Beszel Beszel 是一个轻量级的服务器监控平台,包含 Docker 统计信息、历史数据和警报功能。 它拥有友好的 Web 界面、简单的配置,并且开箱即用。它支持自动备份、多用户、OAuth 身份验证和 API 访问 https://beszel.dev/zh/guide/what-is-besz…...
Spring 微服务解决了单体架构的哪些痛点?
1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高,发布周期通常很长&a…...
Kotlin delay方法解析
本文记录了kotlin协程(Android)中delay方法的字节码实现,并解析了delay方法如何实现挂起操作。 一、delay方法介绍 1.1、delay方法使用举例 class TestDelay {suspend fun testDelay() {Log.d("TestDelay", "before delay")delay(1000)Log.d…...
C# 类型、存储和变量(用户定义类型)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 用户定义类型 除了C#提供的16种预定义类型,还可以创建自己的用户定义类型。有6种类型可以…...