【问题标题】:How to execute multiple QueryBuilders in a transaction using TypeORM如何使用 TypeORM 在事务中执行多个 QueryBuilder
【发布时间】:2021-05-28 07:35:24
【问题描述】:

我有多个使用 QueryBuilder 创建的查询,我想在一个事务中执行所有这些查询。

我阅读了文档,但缺少有关如何将 QueryBuilder 与事务一起使用的信息。我尝试使用相同的 QueryRunner 管理器创建查询,但我真的觉得这没有任何作用。

我还尝试使用 @Transaction 装饰来包装我的方法,但我收到了套接字挂起错误。

这是我目前的尝试,我在示例中只添加了 2 个查询,但我总共有 5 个。

let user, membersInstituition
const connection = getConnection()
const queryRunner = connection.createQueryRunner()

console.log(queryRunner.isTransactionActive) // false
await queryRunner.startTransaction()
try {
    console.log(queryRunner.isTransactionActive) // true
    user = await queryRunner.manager
        .createQueryBuilder(Usuarios, 'user')
        .leftJoin(UltimaAtualizacaoMobile, 'att', 'user.id_usuario = att.id_usuario')
        .select(['user.id_usuario as idUser, user.nome as name, att.ultima_atualizacao as ultimaAtualizacaoMobile'])
        .where('user.id_usuario = :idUsuario', { idUsuario: idUsuario })
        .execute()

    membersInstituition = await queryRunner.manager
        .createQueryBuilder(Instituicoes, 'insti')
        .leftJoin(Amostras, 'am', 'am.id_instituicao = insti.id_instituicao')
        .leftJoin(MembrosInstituicao, 'mi', 'mi.id_instituicao = insti.id_instituicao')
        .leftJoin(Permissoes, 'perm', 'perm.id_permissao = mi.id_permissao')
        .leftJoin(MembrosAmostra, 'mam', 'mam.id_amostra = am.id_instituicao AND mam.id_membro_instituicao = mi.id_membro_instituicao')
        .where('am.id_amostra IN (:...idAmostras)', { idAmostras: idAmostras })
        .andWhere('mi.id_usuario = :idUsuario', { idUsuario: idUsuario })
        .select('mi.id_membro_instituicao as idMember, mam.id_membro_amostra as idMemberAmostra, insti.id_instituicao as idInstituition, perm.permissao as userPermission')
        .orderBy('insti.id_instituicao', 'ASC')
        .execute()

    await queryRunner.commitTransaction()
    console.log(queryRunner.isTransactionActive) // false
} catch (error) {
    // Handle error
} finally {
    await queryRunner.release()
}

【问题讨论】:

  • 您是否尝试记录 usermembersInstituition 值?
  • 这是在 typeorm 中使用事务的正确方法。为什么你觉得什么都没有?您可以记录使用 typeorm 执行的所有查询,并查看它是否启动了事务。
  • 我不知道日志记录可以显示事务何时开始/结束。我确认上面的代码确实有效。谢谢你的提示。

标签: sql orm typeorm


【解决方案1】:

上面的代码确实可以工作,使用 TypeORM 的日志记录确认,它显示了事务开始和提交之前的所有以下查询。

有关如何启用日志记录和验证您的查询是否在同一事务下的更多信息:https://github.com/typeorm/typeorm/blob/master/docs/logging.md

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2021-09-25
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多