以 NestJS 和 TypeORM 进行交易,但不通过实体管理器

2026年8月18日2 次浏览来源:Dev.to阅读原文

交易承诺一个简单的保证:要么是一切承诺,要么是一无所有。

然而,在一个有寄存层的 NestJS 应用程序中,完全可以运行一个没有出错的回滚,然后在数据库中找到一行仍然坐着,应该随它一起消失.

这不是 TypeORM 或 PostgreSQL 错误 。

其中的一个存放处从未在交易中,因为停止被往上三层传递。

没有例外,也没有警告,测试通过是因为那个仓库被嘲笑了.

这篇文章描述了如何使这一类失败成为不可能:交易在一个单一点——处理请求的控制器——开启,而寄存器在进行中的交易中招募自己,而没有收到任何参数.

大约60条线建在...

第二部分是很少讲到的:交易边界的三个后果,每个后果都有固定的.

交易内部的网络呼叫 拥有集合连接 以及整个等待的锁 记录中记录的失败与它本来要记录的失败一样被卷回。

而"筑巢"两次通话并不开启"筑巢"的交易,而是两个独立的交易,带有允许的自死锁.

问题:通过手通过实体经理TypeORM提供这样的交易: 对于一个小项目来说,这是一个正确的答案,不需要更多的答案。

一旦存在寄存层,问题就会出现.

这就是交易:如果寄存器不使用该管理器,则其查询会运行在不同的连接上,最终会出现在交易之外.

寂然而去,而无出错而无出警告.

退后完全不会退后。

所以经理必须到达寄存器,它只能通过手递到达.

应用程序层的使用大小写会是这样的: 对.,即宣布端口并活在域层的界面的影响如下: 此界面生活在域层.

将它放在那里的原因是,这个域宣布它需要什么,而不知道什么是持续存在的。

现在它从...

由此,端口停止为一:如果不拖动ORM,它就无法再被执行了,从您用来测试应用层的内膜双层开始.

根本问题不是美学 这携带着系统的正确性,是看不见的:不通过一个服务的一个分支内的一个电话,就足以使该写作落入交易之外.

它通过代码审查。

它通过测试 嘲笑仓库。

它在生产过程中会出现类似这个的症状, 比如说:一个半失败的操作, 离开一个用户行,而不需要匹配的设置行。

第二种选择——不进行交易——一无所获。

它只把问题推迟到两个相关的写作出现分歧的时候。

然后是目标:没有TypeORM类型的域端口.

交易边界在入口处申报一次。

仓库,在现行交易中自征入伍,在没有交易时行为相同。 "忘记通过某事"不再可能是一个错误,因为没有任何东西被通过.

Async LocalStorage节点自v12起开始发运.

它从本地存储到同步调用链:一个值被设置在根上,其下的任何函数——在任何深度,跨越每一个——都可以读取而无需作为论据.

对上述问题,形状如下: 该商店的范围为同步上下文,而不是全局变量.

两个HTTP同时请求各自持有自己,不受干扰,在读取返回之外。

那块地产才是安全的 这一描述完全吻合:整个呼叫链都需要,不属于中间层。

解决方案:交易执行者住在项目共享的基础设施中.

这是45行,除了TypeORM之外没有依赖性

分享