如何使用 TypeORM 在事务中执行多个 QueryBuilder
How to execute multiple QueryBuilders in a transaction using TypeORM
我有多个使用 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()
}
以上代码确实有效,使用 TypeORM 的日志记录确认,它显示事务开始以及提交前的所有后续查询。
有关如何启用日志记录和验证您的查询是否在同一事务下的更多信息:https://github.com/typeorm/typeorm/blob/master/docs/logging.md
我有多个使用 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()
}
以上代码确实有效,使用 TypeORM 的日志记录确认,它显示事务开始以及提交前的所有后续查询。
有关如何启用日志记录和验证您的查询是否在同一事务下的更多信息:https://github.com/typeorm/typeorm/blob/master/docs/logging.md