TypeORM Transactions - Usar Transaction com vários repositórios
#Nestjs #typeorm
Olá comunidade, tempo atrás tive dificuldade para implementar Transaction
usando o DataSource
personalizado e cheguei na seguinte solução no momento, caso alguém tenha melhorias, ficarei grato ao compartilhar sua solução com a comunidade.
Supondo que eu tenha este serviço de exemplo:
Ao criar uma loja eu crie também um estoque e funcionários
connection.service
async configDataSource() {
// adicionar configurações do banco de dados
const connection = new DataSource({...});
return connection;
}
loja.service
export class MyService {
constructor(
private connection: ConnectionService
) {}
createLoja() {
// chama a função de antes e `initialize`
const datasource = await this.connection.configDataSource();
await datasource.initialize();
// A restrição mais importante ao trabalhar em uma transação é **SEMPRE** use a instância fornecida pelo gerente da entidade-`manager`
await datasource.transaction(async (manager) => {
try {
// usando `getRepository(Loja)`, poderá especificar qual entity irá ser usada naquele momento
await manager.getRepository(Loja).delete(...)
await manager.getRepository(Loja).save(...)
await manager.getRepository(Estoque).save(...)
await manager.getRepository(Funcionario).save(...)
} catch (err) {
return err;
}
});
}
}
Caso dê erro ao inserir um Funcionario, vamos reverter as alterações que fizemos antes.
Fontes: