NestJS 单体应用跨服务共享事务:nestjs-cls @Transactional 装饰器零侵入实践

发布时间:2026/8/24 9:13:52

NestJS 单体应用跨服务共享事务:nestjs-cls @Transactional 装饰器零侵入实践
NestJS 单体应用跨服务共享事务nestjs-cls Transactional 装饰器零侵入实践【免费下载链接】nestjs-clsA continuation-local storage (async context) module compatible with NestJSs dependency injection.项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-clsnestjs-cls 是一款兼容 NestJS 依赖注入的继续本地存储CLSAsync Context模块其官方的nestjs-cls/transactional插件能让数据库事务跨服务无缝共享用一个Transactional装饰器开启事务其他 Service 无需任何参数传递即可自动加入同一个事务实现零侵入的事务管理。本文将从安装、注册到传播模式带你完整走一遍这套 NestJS 事务共享方案。痛点手动传递事务引用有多难受在 NestJS 单体应用中一个业务动作往往横跨多个 Service创建用户 → 同时创建账户 → 同时写入审计日志这些写操作必须要么全部成功要么全部回滚传统做法是把事务对象如 Prisma 的$transaction、Knex 的trx作为参数一层层往下传OrderService.create() └─ PaymentService.charge(tx) └─ InventoryService.deduct(tx) └─ AuditService.log(tx)调用链每加一层方法签名就多一个tx参数——封装被破坏、测试困难、代码冗长。这正是 nestjs-cls 要解决的问题把事务引用存进 CLS 上下文任何同请求链路内的代码都能直接取到参数列表彻底解放。它如何工作CLS 上下文原理一句话版nestjs-cls 基于 Node.js 的AsyncLocalStorage在整个请求生命周期内提供一块公共黑板请求进入时初始化上下文中间件/拦截器完成事务插件开启事务后把事务引用写入上下文任何 Service 里的TransactionHost.tx读取到的都是同一个事务回调正常结束 → 提交抛出异常 → 回滚核心逻辑位于 transaction-host.ts 的TransactionHost类装饰器实现见 transactional.decorator.ts。快速上手3 步完成安装与注册第 1 步安装事务插件 对应数据库适配器插件与 ORM 解耦通过适配器支持主流数据库库适配器适用库PrismaPrismaTypeORMTypeORMKnex / KyselyKnex、KyselyDrizzle ORMDrizzle ORMPg-promisepg-promiseMongoDB / MongooseMongoDB、Mongoose第 2 步在ClsModule.forRoot的 plugins 中注册ClsModule.forRoot({ plugins: [ new ClsPluginTransactional({ imports: [PrismaModule], adapter: new TransactionalAdapterPrisma({ prismaInjectionToken: PrismaClient, }), }), ], }),注册后会得到一个全局可用的TransactionHostProvider负责开启事务与读写事务引用。第 3 步给方法打上Transactional装饰器Injectable() class UserService { constructor(private readonly txHost: TransactionHostTransactionalAdapterPrisma) {} Transactional() async createUser(name: string) { const user await this.txHost.tx.user.create({ data: { name } }); await this.accountService.createAccountForUser(user.id); // 自动加入同一事务 return user; } }AccountService内部完全不用知道自己处在事务里只需使用this.txHost.tx执行查询——事务共享是自动的这就是零侵入的关键。事务如何在服务间自动共享关键就在TransactionHost的两个成员见 transaction-host.tstx当前活跃事务的引用无事务时回退到普通非事务客户端业务代码永远有合法对象可用withTransaction(callback)无法用装饰器场景如普通函数的手动开启方式回调成功即提交、抛错即回滚Transactional本质上就是对withTransaction的语法糖封装它用Proxy包裹被装饰方法调用时自动执行TransactionHost.withTransaction(...)并支持传入传播模式与隔离级别等选项。事务传播模式嵌套调用的行为控制当一个Transactional方法调用了另一个Transactional方法如何决策加入还是新开Propagation枚举propagation.ts提供了与 Spring 一致的 7 种模式模式行为Required默认有事务就复用没有就新建RequiresNew无论是否有事务都新开一个独立提交Mandatory必须复用已有事务否则抛异常Never必须在无事务下运行有事务则抛异常Supports有就复用没有就裸奔运行NotSupported强制脱离事务运行Nested创建子事务需适配器支持否则回退为Required// 日志服务强制独立提交即使外层订单事务回滚日志也保留 Transactional(Propagation.RequiresNew) async logOrder(...) { ... } // 校验方法强制要求在外层事务中运行 Transactional(Propagation.Mandatory, { isolationLevel: Serializable }) async validate(...) { ... }多数据源场景命名连接项目同时使用多个数据库甚至多个 ORM时注册多个ClsPluginTransactional并各给一个connectionName即可注入与装饰器同步指定连接名Injectable() class UserService { constructor( InjectTransactionHost(prisma-connection) private readonly txHost: TransactionHostTransactionalAdapterPrisma, ) {} Transactional(prisma-connection) async createUser(...) { ... } }单元测试友好不依赖真实数据库装饰器式事务对单测的友好度常被低估Mock 装饰器用jest.mock把Transactional替换为 no-op方法退化为普通方法No-op 适配器NoOpTransactionalAdapter不真正开启事务但完整保留tx的传播链路可直接塞入 mock 客户端完整可运行示例就在 packages/transactional/test/ 目录下官方插件文档见 docs/docs/06_plugins/01_available-plugins/01-transactional/index.md。总结何时选择这套方案场景推荐度单体应用多 Service 协作写库⭐⭐⭐⭐⭐ 完美契合多个 ORM / 多数据源混合⭐⭐⭐⭐⭐ 命名连接轻松覆盖已有手动传参、想渐进迁移⭐⭐⭐⭐InjectTransaction支持平滑过渡微服务跨进程事务⭐ 不适用CLS 是进程内上下文一句话回顾nestjs-cls 的 Transactional 插件用 CLS 上下文承载事务引用Transactional装饰器声明式开启事务服务间共享零参数、零侵入——把传事务从业务代码里彻底抹掉让 NestJS 团队可以把精力真正花在业务逻辑上。【免费下载链接】nestjs-clsA continuation-local storage (async context) module compatible with NestJSs dependency injection.项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-cls创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何开发 Halo 仪表盘组件:从注册到拖进 12 列网格

如何开发 Halo 仪表盘组件:从注册到拖进 12 列网格

2026/8/24 9:13:52

如何开发 Halo 仪表盘组件:从注册到拖进 12 列网格 【免费下载链接】halo Halo 是一款强大易用的开源建站工具,从个人博客、知识库,到企业官网、在线商城,Halo 都能助您轻松实现,一站式满足您的多样化建站需求。 项目…

SEE框架:让GUI智能体通过结构感知探索与利用实现长序列任务规划

SEE框架:让GUI智能体通过结构感知探索与利用实现长序列任务规划

2026/8/24 9:03:51

1. 项目概述:当GUI智能体需要“看得更远”在自动化测试、机器人流程自动化(RPA)乃至未来的通用人工智能(AGI)助手领域,让一个智能体(Agent)在图形用户界面(GUI&#xff0…

Qwerty Learner:免费开源的英语打字练习工具,背单词与提升速度一步完成

Qwerty Learner:免费开源的英语打字练习工具,背单词与提升速度一步完成

2026/8/24 9:03:51

Qwerty Learner:免费开源的英语打字练习工具,背单词与提升速度一步完成 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard work…

C++模板进阶:从SFINAE到编译期计算的泛型编程实战

C++模板进阶:从SFINAE到编译期计算的泛型编程实战

2026/8/24 12:04:00

1. 项目概述&#xff1a;从“能用”到“精通”的C模板之路如果你已经写过一些C模板代码&#xff0c;比如用std::vector<int>或者自己写过一个简单的template <typename T> T max(T a, T b)&#xff0c;那么恭喜你&#xff0c;你已经踏入了C泛型编程的大门。但很多时…

AI Agent在法律场景的落地:事实待审核机制与数字分身构建

AI Agent在法律场景的落地:事实待审核机制与数字分身构建

2026/8/24 12:04:00

1. 先搞清楚“AI只给建议不背锅”到底怎么落地这个话题的核心&#xff0c;不是讨论AI能不能取代律师&#xff0c;而是探讨在严肃的法律服务场景下&#xff0c;如何把AI用成一个“高能实习生”或“超级助理”&#xff0c;同时把责任边界划得清清楚楚。很多团队一上来就想着让AI直…

平台商家竞争模拟系统:从沙盘推演到实战经营的技术实现与价值

平台商家竞争模拟系统:从沙盘推演到实战经营的技术实现与价值

2026/8/24 12:04:00

1. 从“温室”到“战场”&#xff1a;为什么我们需要模拟竞争环境 在任何一个电商、外卖、出行或者内容平台上&#xff0c;新入驻的商家或创作者&#xff0c;最初的感觉可能都像是在一个精心布置的“温室”里。平台会给你一些初始流量扶持&#xff0c;告诉你规则&#xff0c;让…

【单片机课程设计/毕业设计】基于 STM32 的环境感知蓝牙智能台灯软硬件设计 基于 STM32 的自动感应多档位台灯控制系统研发(018304)

【单片机课程设计/毕业设计】基于 STM32 的环境感知蓝牙智能台灯软硬件设计 基于 STM32 的自动感应多档位台灯控制系统研发(018304)

2026/8/24 12:04:00

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

Spring Boot+Vue 3健身房管理系统:集成DeepSeek AI的Java全栈实战

Spring Boot+Vue 3健身房管理系统:集成DeepSeek AI的Java全栈实战

2026/8/24 12:04:00

这次我们来看一个健身房管理系统项目&#xff0c;它整合了当前主流的技术栈&#xff1a;Spring Boot、Vue 3&#xff0c;并创新性地接入了DeepSeek AI聊天功能。对于正在寻找Java全栈毕设项目、希望丰富简历实战经验&#xff0c;或者想了解如何将大模型API集成到业务系统中的开…

基于SpringBoot的设计师约稿平台系统(毕业设计项目源码+文档)

基于SpringBoot的设计师约稿平台系统(毕业设计项目源码+文档)

2026/8/24 11:53:58

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/23 0:02:09

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/23 0:02:09

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/23 0:02:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

2026/8/24 0:03:28

OpenModScan&#xff1a;免费跨平台 Modbus 主站调试工具&#xff0c;让现场通讯验证一键搞定 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan OpenModScan 是一款开源免…

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

2026/8/24 0:03:28

WechatHook 终极指南&#xff1a;5大核心能力详解&#xff0c;3分钟看懂微信自动化 【免费下载链接】WechatHook Enjoy hooking wechat by Xposed....Accessibility...and so on... 项目地址: https://gitcode.com/gh_mirrors/we/WechatHook WechatHook 是一个基于 Xpos…

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

2026/8/24 0:03:28

如何在ThinkPad X390上安装macOS&#xff1a;OpenCore EFI完整指南 【免费下载链接】ThinkpadX390-Opencore-EFI macOS Catalina & Big Sur & Monterey on ThinkPad X390 (Hackintosh) 项目地址: https://gitcode.com/gh_mirrors/th/ThinkpadX390-Opencore-EFI …

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…