【发布时间】: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()
}
【问题讨论】:
-
您是否尝试记录
user和membersInstituition值? -
这是在 typeorm 中使用事务的正确方法。为什么你觉得什么都没有?您可以记录使用 typeorm 执行的所有查询,并查看它是否启动了事务。
-
我不知道日志记录可以显示事务何时开始/结束。我确认上面的代码确实有效。谢谢你的提示。