TypeORM 是否为不同存储库提供事务?

2023-12-22

目前,三个不同的存储库需要将某些内容作为单个事务进行处理。

我的服务代码写如下。但与我想象的不同,每个存储库都生成自己的事务。我怎么解决这个问题?

// TrimService

@Injectable()
export class TrimService {
    constructor(
        private readonly trimRepository: TrimRepository,
        private readonly tireRepository: TireRepository,
        private readonly userRepository: UserRepository
    ) {}

    async saveUserTrim(saveUserTrimDto: SaveUserTrimDto, res) {
        const queryRunner = await getConnection().createQueryRunner();
        await queryRunner.startTransaction();

        try {
            const findUser: User = await this.userRepository.findUser(
                saveUserTrimDto.id,
                queryRunner.manager
            );

            const createTrim: Trim = await this.trimRepository.saveUserTrim(
                findUser,
                saveUserTrimDto.trimId,
                queryRunner.manager
            );

            await this.tireRepository.saveTrimTire(
                createTrim,
                res,
                queryRunner.manager
            );

            await queryRunner.commitTransaction();
            return createTrim;
        } catch (err) {
            console.log(err);
            await queryRunner.rollbackTransaction();
        } finally {
            await queryRunner.release();
        }
    }
}
// userRepository

@EntityRepository(User)
export class UserRepository extends Repository<User> {
    async findUser(
        id: string,
        @TransactionManager() transactionManager?: EntityManager
    ) {
        const findUser = await this.findOne({ id: id });

        if (!findUser) {
            throw new NotFoundUserException();
        }

        return findUser;
    }
}

我解决了这个问题。事务管理器从每个查询中接收并且必须使用该方法。由于userRepository是findOne,所以还没有进行事务处理。

// TrimService

@Injectable()
export class TrimService {
    constructor(
        private readonly trimRepository: TrimRepository,
        private readonly tireRepository: TireRepository,
        private readonly userRepository: UserRepository
    ) {}

    async saveUserTrim(saveUserTrimDto: SaveUserTrimDto, res) {
        const queryRunner = await getConnection().createQueryRunner();
        await queryRunner.startTransaction();

        const findUser: User = await this.userRepository.findUser(
            saveUserTrimDto.id
        );

        try {
            const createTrim: Trim = await this.trimRepository.saveUserTrim(
                queryRunner.manager,
                findUser,
                saveUserTrimDto.trimId
            );

            await this.tireRepository.saveTrimTire(
                queryRunner.manager,
                createTrim,
                res
            );

            await queryRunner.commitTransaction();
            return createTrim;
        } catch (err) {
            console.log(err);
            await queryRunner.rollbackTransaction();
        } finally {
            await queryRunner.release();
        }
    }
}

// TrimRepository

@EntityRepository(Trim)
export class TrimRepository extends Repository<Trim> {
    async saveUserTrim(
        @TransactionManager() transactionManager: EntityManager,
        findUser: User,
        trimId: number
    ) {
        const findTrim = await transactionManager.findOne(Trim, {
            trimId: trimId,
            user: findUser
        });

        if (findTrim) {
            throw new TrimOverlapException();
        }

        const createTrim: Trim = await transactionManager.create(Trim, {
            trimId: trimId,
            user: findUser
        });

        return await transactionManager.save(Trim, createTrim);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeORM 是否为不同存储库提供事务? 的相关文章

随机推荐

  • 何时在数据库列中使用逗号分隔值?

    好的 我知道技术答案是NEVER https stackoverflow com questions 3653462 is storing a comma separated list in a database column really
  • Spotfire IronPython 脚本可滚动筛选器并每一步更新可视化(按日期范围播放按钮)

    大家早上好 我已经研究这个问题几天了 但无法找到解决办法 我已经研究和谷歌搜索无济于事 任何帮助 见解将不胜感激 我正在尝试创建一个按钮 单击该按钮时将自动通过日期过滤器 例如从 1 1 15 开始 并通过 1 2 1 5 在逐步通过时使用
  • 找不到符号方法startActivity(android.content.Intent)

    我是制作 Android 应用程序的初学者 我制作了一个显示我的网页的网络视图 我的网页包含我希望在邮件和拨号等外部应用程序中打开的联系人按钮 因此我得到了一些帮助并得到了这样的代码 import android app Activity
  • 如何检测浏览器类型及其版本

    我如何在 Rails 中检测浏览器类型及其版本 我想检查特定浏览器的版本 如果不需要浏览器版本 则要求用户升级它 我使用下面指定的命令 但由于它不遵循标准模式 我无法使用它 request env HTTP USER AGENT Chrom
  • PHP YAML 解析器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CSS 定位和 CSS 边距之间的区别

    今天我学习了CSS中的两个概念 一个是CSS定位 静态 相对 绝对 固定 另一个是CSS边距 它定义元素之间的空间 假设我想移动一个元素 这是最好的方法吗 因为这两个概念似乎都能够做同样的事情 示例可能如下 代码 CSS定位
  • 抱歉,处理您的请求时发生错误[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 windows azure 中
  • PhoneGap 文件删除不起作用

    我正在构建一个基本的应用程序 其中非常具有 PhoneGap 功能 因为我试图确定它可以 不能做什么 我已经到了想要删除已在应用程序上下载的文件的阶段 但它不起作用 我使用的大部分代码来自http docs phonegap com en
  • 如何求整数n次根?

    我想找到小于或等于n的k次方根的最大整数 我试过 int n 1 k 但对于 n 125 k 3 这给出了错误的答案 我碰巧知道 5 的立方是 125 gt gt gt int 125 1 3 4 有什么更好的算法 背景 2011 年 这个
  • 随机选择一个目录下的100个文档

    该目录下大约有2000个文档 我想随机选择一些文档并自动将它们复制到新目录 一些相关信息 https stackoverflow com questions 701402 best way to choose a random file f
  • ASP.NET core Web API授权属性返回404错误并强制重定向

    我有 asp net core 2 0 解决方案 其中包含以下项目 Data EF代码的类库 OAuth 作为 IdentityServer4 代码的 Web 应用程序项目 Api 用于我创建为空 Web 项目的 API 现在OAuth项目
  • 如何映射具有未知嵌套级别的数组?

    我有一个可以有答案的注释数组 因此数组的每个元素 注释 都可以有嵌套元素 注释 并且嵌套级别未知 但我需要在 ReactJs 中渲染这个数组 以使用给定的值显示这些注释嵌套级别 comment 1 comment 2 comment 3 c
  • 如何仅当上一步失败时才在 Jenkins 中运行条件步骤

    我正在尝试在詹金斯创建一个两步工作 我希望只有在第一步失败时才运行第二步 第一步执行单元测试以查看我正在编译的代码是否良好 如果不是 那么我想在第二步中运行一些诊断 有条件的阶梯插头似乎是一个不错的选择 但是 我无法弄清楚如何使用条件步骤插
  • .net core 项目依赖项 - 黄色三角形

    我的 Net Core 项目的依赖项上有一个黄色三角形 但是当我打开它时 所有子条目都没有黄色三角形 当我将鼠标悬停在依赖项上时 我没有看到任何工具提示告诉我出了什么问题 如何检查导致出现此黄色三角形的原因 我按照 oandreeeee 的
  • Lambda 和内存泄漏:寻找替代方法

    Edit 如果一位有能力验证此类事情的经验丰富的程序员向我展示该方法不会出现内存泄漏的证据 我将不胜感激 我已经将它引入到我的许多编码工作中 但我心中仍然有一个小疑问 不幸的是我不够好 不知道调查它的工具 原来的 我最近了解到 lambda
  • Octave - .m 文件编译器?

    我知道与Matlab可以将脚本 函数编译为可执行文件 然后与 Matlab 编译器运行时一起成为独立版本 有什么可能的方法编译与 Octave 相关的 m 文件作为可执行程序 不再需要 m 文件来运行 我想要一个独立版本的脚本 可以与八度库
  • 索引 16 处的路径中存在非法字符[重复]

    这个问题在这里已经有答案了 我在 RAD 中收到以下错误 java net URISyntaxException Illegal character in path at index 16 file E Program Files IBM
  • 在页面加载时获取ajax哈希url

    假设我在进行 ajax 调用时设置了一个哈希值 例子 http example com hash html http example com hash html 如果我加载另一个页面并单击后退按钮 我将如何检测哈希值并在加载时提取 url
  • CodeIgniter 的重写规则不起作用

    我已经安装了一个干净的 Apache2 加上 PHP 和 MySQL 服务器并启用了mod rewrite在阿帕奇配置中 我添加了 htaccess文件以从 url 中删除 index php 如 CodeIgniter wiki 中所述
  • TypeORM 是否为不同存储库提供事务?

    目前 三个不同的存储库需要将某些内容作为单个事务进行处理 我的服务代码写如下 但与我想象的不同 每个存储库都生成自己的事务 我怎么解决这个问题 TrimService Injectable export class TrimService