Spring Boot事务no-rollback-for配置全指南:避开这3个坑,系统稳定性提升80%

第一章:Spring Boot事务no-rollback-for概述

在Spring Boot的事务管理中,`@Transactional`注解是控制事务行为的核心工具。默认情况下,当方法抛出未检查异常(即运行时异常)时,事务会自动回滚;而对于受检异常,则不会触发回滚。然而,在某些业务场景下,即使发生了特定异常,仍希望事务不回滚,此时可使用`noRollbackFor`属性进行精细化控制。

作用与使用场景

`noRollbackFor`允许开发者指定哪些异常类型发生时,事务不应被回滚。这在处理可预期的业务异常时尤为有用,例如用户输入校验失败或业务规则拦截等情形,避免不必要的数据回退。

基本用法示例

以下代码展示如何在服务方法中使用`noRollbackFor`:
@Service
public class OrderService {

    @Transactional(noRollbackFor = BusinessException.class)
    public void placeOrder(Order order) {
        // 保存订单
        saveOrder(order);
        
        // 抛出业务异常但不回滚
        if (order.getAmount() <= 0) {
            throw new BusinessException("订单金额必须大于0");
        }
    }

    private void saveOrder(Order order) {
        // 持久化逻辑
    }
}
上述代码中,尽管抛出了`BusinessException`,但由于已在`@Transactional`中声明`noRollbackFor`,事务将正常提交或继续执行其他操作。

支持的异常类型配置

可通过数组形式指定多个异常类型:
  • 单一异常:`noRollbackFor = BusinessException.class`
  • 多个异常:`noRollbackFor = { BusinessException.class, ValidationException.class }`
此外,也可结合`rollbackFor`同时定义回滚与不回滚的异常策略,实现更复杂的事务控制逻辑。
属性名作用
rollbackFor指定触发回滚的异常类型
noRollbackFor指定不触发回滚的异常类型

第二章:no-rollback-for核心机制解析

2.1 事务回滚的默认行为与异常分类

在Spring框架中,事务的回滚默认仅对检查型异常(checked exception)之外的运行时异常(RuntimeException)和错误(Error)生效。这意味着当方法抛出RuntimeException时,事务会自动回滚;而普通异常如IOException则不会触发回滚。
异常类型与回滚行为对照
  • 自动回滚:继承自RuntimeException的异常,如NullPointerException
  • 不自动回滚:检查型异常,如SQLException、IOException
  • 可配置回滚:通过@Transactional(rollbackFor = ...)显式指定
代码示例与说明
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    accountMapper.decreaseBalance(fromId, amount);
    // 抛出运行时异常,触发回滚
    if (amount.compareTo(BigDecimal.TEN) > 0) {
        throw new IllegalArgumentException("转账金额不得超过10元");
    }
    accountMapper.increaseBalance(toId, amount);
}
上述代码中,IllegalArgumentException为运行时异常,Spring会捕获并触发事务回滚,确保数据库状态一致性。若需对检查型异常回滚,必须使用rollbackFor属性明确声明。

2.2 no-rollback-for的配置原理与生效时机

在Spring事务管理中,`no-rollback-for`用于指定某些异常发生时**不触发事务回滚**。该配置通过`@Transactional(noRollbackFor = {...})`声明,覆盖默认的回滚行为。
配置语法与示例
@Transactional(noRollbackFor = {BusinessException.class})
public void processOrder() {
    // 业务逻辑
    throw new BusinessException("订单校验失败");
}
上述代码中,即使抛出`BusinessException`,事务仍会正常提交,不会回滚。
生效时机分析
当方法执行过程中抛出异常时,Spring的`TransactionAspectSupport`会检查异常类型是否匹配`noRollbackFor`列表:
  • 若匹配,则清除回滚标记(setRollbackOnly(false))
  • 若不匹配且为非检查异常,默认标记回滚
该机制适用于部分可预期异常场景,避免过度回滚影响数据一致性。

2.3 Checked Exception与Unchecked Exception的影响分析

Java中的异常分为Checked Exception和Unchecked Exception,二者在编译期处理机制上存在本质差异。Checked Exception(如IOException)必须显式捕获或声明抛出,增强了程序的健壮性,但也增加了代码冗余。
典型异常分类对比
  • Checked Exception:编译器强制处理,常见于外部交互场景
  • Unchecked Exception:运行时异常(RuntimeException),如NullPointerException,无需强制捕获
public void readFile() throws IOException {
    FileReader file = new FileReader("config.txt"); // 必须处理IOException
}
上述代码中,IOException为Checked Exception,调用者需通过try-catch或throws进一步处理,确保异常路径可控。
设计影响分析
过度使用Checked Exception可能导致异常沿调用链层层上抛,增加接口耦合度。而Unchecked Exception虽简化代码,但易导致未预期的程序中断。合理选择异常类型是构建可维护系统的关键。

2.4 Spring AOP代理对异常捕获的干预机制

在Spring AOP中,代理对象通过环绕通知(Around Advice)介入目标方法的执行流程,从而影响异常的抛出与捕获时机。当目标方法抛出异常时,异常首先被AOP代理拦截,由通知逻辑决定是否继续向上抛出。
异常拦截流程
代理对象在调用链中位于原始方法之前,任何异常都会先经过ProceedingJoinPoint.proceed()的调用栈。

@Around("execution(* com.service.*.*(..))")
public Object handleException(ProceedingJoinPoint pjp) {
    try {
        return pjp.proceed(); // 异常在此处被捕获
    } catch (Exception e) {
        log.error("AOP拦截到异常: ", e);
        throw e; // 重新抛出,否则异常无法传递
    }
}
若未在catch块中重新抛出异常,调用方将无法感知异常,导致异常“消失”。这要求开发者在编写通知时明确处理异常传播逻辑。
异常类型的影响
Spring AOP仅能捕获被代理方法声明抛出的检查异常(checked exception),而运行时异常(RuntimeException)可自动穿透代理层。

2.5 源码视角解读TransactionInterceptor处理流程

核心拦截逻辑分析
TransactionInterceptor作为Spring事务管理的核心组件,通过AOP机制拦截目标方法调用。其核心逻辑位于invoke()方法中,依据方法的事务属性决定是否开启新事务。
public Object invoke(MethodInvocation invocation) throws Throwable {
    Class targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
    return invokeWithinTransaction(invocation.getMethod(), targetClass, new CoroutinesInvocationCallback() {
        @Override
        public Object proceedWithInvocation() throws Throwable {
            return invocation.proceed();
        }
    });
}
该代码段展示了方法调用被封装进事务执行流程的过程。其中invocation.proceed()代表目标方法的实际执行,由invokeWithinTransaction统一包裹在事务上下文中。
事务决策流程
  • 解析目标方法的@Transactional注解属性
  • 根据传播行为(Propagation Behavior)决定事务创建策略
  • 在前置处理中绑定事务状态到当前线程(ThreadLocal)
  • 异常发生时依据回滚规则判定是否触发rollback

第三章:典型应用场景与配置实践

3.1 忽略特定业务异常实现柔性事务控制

在分布式事务场景中,某些业务异常属于预期行为,不应触发全局回滚。通过识别并忽略这类异常,可实现更灵活的事务控制。
异常分类与处理策略
  • 系统异常:如网络超时、数据库连接失败,需回滚事务
  • 业务异常:如库存不足、用户余额不够,可预知且无需回滚
代码实现示例

@GlobalTransactional(rollbackFor = Exception.class)
public void placeOrder(Order order) {
    try {
        inventoryService.deduct(order.getItemId());
    } catch (InsufficientStockException e) {
        // 仅记录日志,不抛出异常中断事务
        log.warn("库存不足,订单部分可降级处理", e);
    }
    paymentService.pay(order);
}
上述代码中,InsufficientStockException 被捕获并降级处理,避免触发Seata全局回滚,保障主事务流程继续执行。

3.2 集成自定义异常类避免误回滚

在分布式事务场景中,非业务性异常(如网络超时)常被误判为业务失败,导致不必要的事务回滚。通过定义明确的自定义异常类,可精准区分异常类型,控制回滚策略。
自定义异常设计
定义继承自 RuntimeException 的业务异常类,标记是否触发回滚:
public class BusinessException extends RuntimeException {
    private final boolean rollback;

    public BusinessException(String message, boolean rollback) {
        super(message);
        this.rollback = rollback;
    }

    public boolean isRollback() {
        return rollback;
    }
}
该类通过 rollback 字段显式控制事务行为,确保仅关键业务异常触发回滚。
异常处理集成
在事务方法中结合 AOP 或全局异常处理器识别自定义异常:
  • 抛出 BusinessException 且 rollback=true:触发回滚
  • 抛出其他运行时异常:默认回滚
  • 捕获非关键异常并封装为不回滚的 BusinessException:避免误判

3.3 多层调用中no-rollback-for的传递性验证

在Spring事务管理中,no-rollback-for属性用于指定某些异常发生时不触发事务回滚。当存在多层服务调用时,该属性的传递性至关重要。
异常传递与事务行为
若底层方法抛出被no-rollback-for排除的异常,外层事务应继续提交。需验证跨层级调用时此行为是否一致。
@Service
public class ServiceA {
    @Autowired
    private ServiceB serviceB;

    @Transactional(noRollbackFor = BusinessException.class)
    public void outerMethod() {
        serviceB.innerMethod();
        throw new BusinessException("忽略回滚");
    }
}
上述代码中,BusinessException被声明为不触发回滚,即使在outerMethod中抛出,事务也不会回滚。
  • 事务边界由最外层@Transactional决定
  • 异常类型匹配影响回滚策略执行
  • 子方法异常若被捕获则不影响主事务

第四章:常见陷阱与避坑策略

4.1 坑一:异常被吞导致事务无法触发回滚或忽略

在Spring声明式事务中,事务的回滚默认仅对RuntimeException和Error生效。若捕获了异常但未重新抛出,会导致事务“感知”不到异常,从而无法触发回滚。
常见错误场景
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    try {
        accountMapper.decrease(fromId, amount);
        accountMapper.increase(toId, amount);
    } catch (Exception e) {
        log.error("转账失败", e);
        // 异常被吞,事务不会回滚!
    }
}
上述代码中,即使数据库操作失败,由于异常被捕获且未抛出,事务管理器认为方法执行成功,导致事务提交而非回滚。
解决方案
  • 避免在事务方法中捕获异常后不处理;
  • 若需日志记录,应重新抛出异常或通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()手动标记回滚。

4.2 坑二:父子容器或AOP代理失效导致配置不生效

在Spring应用中,当使用父子容器(如Web项目中DispatcherServlet对应的子容器)时,若Bean被定义在父容器中,而AOP切面仅扫描子容器,会导致代理未生效,从而使得事务、缓存等注解配置失效。
AOP代理失效场景示例
@Configuration
@ComponentScan("com.example.service")
@EnableTransactionManagement
public class RootConfig {}

@Configuration
@Import(RootConfig.class)
public class WebConfig extends WebMvcConfigurerAdapter {}
上述代码中,RootConfig为父容器,若Service Bean和@Transactional同时位于父容器,但事务管理器仅作用于子容器,则事务将无法织入。
解决方案对比
方案说明
统一容器扫描确保AOP与目标Bean处于同一容器上下文
@EnableAspectJAutoProxy(proxyTargetClass=true)强制使用CGLIB代理,提升代理覆盖范围

4.3 坑三:错误使用RuntimeException子类破坏预期行为

在Java异常处理中,RuntimeException及其子类属于非受检异常,开发者常误用它们替代业务逻辑中的正常流程控制,导致调用方无法预知异常路径。
常见误用场景
将IllegalArgumentException或自定义RuntimeException用于流程中断,而非真正表示程序错误:
public User findUser(String id) {
    if (id == null || id.isEmpty()) {
        throw new IllegalArgumentException("用户ID不能为空");
    }
    // 查询逻辑
}
上述代码本应返回Optional<User>或自定义错误码,却通过抛出异常中断流程,增加调用方负担。
推荐实践
  • 仅在程序逻辑错误时抛出RuntimeException
  • 业务异常应使用受检异常或返回值封装结果
  • 避免在高频调用路径中触发异常,影响性能

4.4 结合日志与测试验证no-rollback-for正确性

在Spring事务管理中,`no-rollback-for`属性用于指定某些异常发生时不触发事务回滚。为验证其行为正确性,需结合单元测试与日志输出进行双重确认。
测试场景设计
通过模拟业务方法抛出配置的异常类型,观察事务是否按预期提交。同时开启Spring事务调试日志,监控回滚决策过程。
@Test
public void testNoRollbackFor() {
    try {
        service.saveWithBusinessException(); // 抛出 BusinessException
    } catch (Exception e) {
        // 捕获但不处理
    }
    assertEquals(1, jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class));
}
该测试验证当抛出 BusinessException 时事务仍提交。配合日志可确认:
  • 事务未标记为 rollback-only
  • Connection.commit() 被正常调用
日志断点验证
查看日志中“Completing transaction for”及“Triggering beforeCompletion synchronization”等关键条目,确保无“rolling back”字样,从而佐证no-rollback-for生效。

第五章:总结与最佳实践建议

持续集成中的自动化测试策略
在现代 DevOps 实践中,将单元测试与集成测试嵌入 CI/CD 流程是保障代码质量的关键。以下是一个典型的 GitHub Actions 工作流片段,用于自动运行 Go 语言项目的测试套件:

name: Run Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.21'
      - name: Run tests
        run: go test -v ./...
生产环境配置管理建议
避免将敏感信息硬编码在代码中,推荐使用环境变量或专用配置服务(如 HashiCorp Vault)。以下是 Kubernetes 中通过 Secret 注入环境变量的示例:

env:
  - name: DATABASE_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: password
  • 始终对 Secrets 进行加密存储
  • 实施最小权限原则,限制服务账户权限
  • 定期轮换密钥和证书
  • 启用审计日志以追踪配置变更
性能监控与告警机制
建立有效的监控体系可显著提升系统稳定性。建议组合使用 Prometheus 采集指标、Grafana 可视化、Alertmanager 触发告警。关键监控指标应包括:
指标名称建议阈值监控频率
CPU 使用率>80%每15秒
内存占用>85%每30秒
请求延迟 P99>500ms每分钟
YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

Superpowers-zh:AI编程的职业大脑与技能化工作流

AI编程不是简单生成代码,而是需遵循软件工程规范的系统性实践。从需求澄清、方案设计、测试驱动开发到合规审查与Git交付,核心在于将抽象原则转化为可执行、可验证的标准化能力。Superpowers-zh 以‘技能(Skills)’替代静态模板,通过状态机、检查清单与分支逻辑,实现事务一致性保障、分布式锁校验、国产代码规范嵌入等关键工程控制点。它不绑定特定模型或IDE,适配Cursor、Qwen Code、VS Code Copilot等主流AI编程环境,本质是面向生产就绪的AI编程操作系统。本文详解其技能调度

anvt77205的博客 439

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

产业园区运营负责人如何利用平台实现企业创新需求的精准分析与服务推送?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员在推动成果转化落地过程中,如何实现科技成果的高效推介与价值评估?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何通过数智工具提升技术需求挖掘的精准度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

政府科技管理者如何在政策支持中更精准地识别和支持高价值科技项目?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

全桥LLC谐振变化器参数设计资料(闭环仿真+参数设计报告)

内容概要:本文档系统性地介绍了全桥LLC谐振变换器的闭环仿真建模与关键参数设计方法,涵盖其工作原理、谐振元件(如谐振电感、谐振电容、励磁电感)的计算与优化流程,并结合Simulink或Plecs等仿真平台构建闭环控制系统模型,重点验证变频控制策略下的软开关实现、系统增益特性、效率优化及动态响应性能。资料包含完整的仿真模型、参数设计报告、数学计算书及参考文献,支持从理论分析到工程实践的全流程研究,适用于高频高效DC-DC变换器的研发与教学应用。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校学生、科研人员,以及从事开关电源、新能源变换器、工业电源研发的工程技术人员,具备电路拓扑基础与仿真软件操作能力者更佳。; 使用场景及目标:①深入掌握全桥LLC谐振变换器的工作机理与谐振参数设计准则;②学习并实现闭环反馈控制系统的建模与稳定性分析;③支撑科研课题、课程设计、毕业设计或实际产品开发中的拓扑选型与性能验证需求;④通过仿真与计算联动提升对软开关技术与效率优化的理解与应用能力。; 阅读建议:建议结合所提供的仿真文件与设计文档同步操作,按照“建模—参数计算—仿真验证—性能分析”的流程逐步推进,重点关注频率调节对ZVS/ZCS实现的影响,对比不同负载条件下的闭环响应差异,深化对谐振腔特性和控制策略协同作用的理解。

PSIM-三相维也纳VIENNA整流器电压电流双闭环+中点电位平衡SVPWM控制仿真

内容概要:本文档详细介绍了一种基于PSIM软件实现的三相维也纳(VIENNA)整流器仿真模型,重点实现了电压电流双闭环控制与中点电位平衡的SVPWM调制策略。该仿真系统通过精确的控制算法有效提升了整流器的功率因数,降低了输入电流谐波含量,并解决了三电平拓扑中常见的直流侧中点电位偏移问题,具有较高的工程实用价值,适用于高效率、高功率密度的电力电子系统设计与科研验证。文档还整合了丰富的配套资源,涵盖多种电力电子变换器拓扑结构、先进控制算法及典型应用场景,形成了系统化的技术资料体系,有助于深入理解现代整流技术的核心原理与发展动态。; 适合人群:面向从事电力电子、电气工程、新能源变换系统等领域的科研人员、高校研究生以及具备一定仿真基础的工程技术人员。; 使用场景及目标:①深入研究三相VIENNA整流器的工作机理与控制特性;②掌握电压外环、电流内环双闭环控制结构的设计方法;③理解并实现SVPWM调制技术与中点电位平衡控制策略的协同作用;④开展相关控制算法的仿真验证、性能优化与实验对比,为高性能整流装置的研发提供理论支撑和技术原型。; 阅读建议:建议结合文中列出的其他仿真案例(如PWM整流器、LLC谐振变换器、DAB变换器等)进行横向对比学习,充分利用所提供的PSIM、MATLAB/Simulink等多平台仿真资源,重点关注控制逻辑与主电路的耦合关系,通过参数调试与波形分析深化对系统动态响应和稳态性能的理解,强化“理论—建模—仿真—优化”的闭环研究能力。

产业园区运营负责人如何利用数智工具提升园区企业的技术对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

政府科技管理者如何提升区域科技成果转化项目的评价与筛选效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ICD10 openGauss版

ICD10 openGauss版

上一篇: Java线程池corePoolSize设置陷阱(90%开发者都踩过的坑)
下一篇: 为什么你的Record类equals比较失败?(90%开发者忽略的结构约束)
Instrustar
博客等级 码龄1年 182粉丝 2225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值