TypeORM - Transações

Geralmente, a transação é uma unidade lógica responsável pela execução da recuperação de dados e atualizações. Esta seção explica sobre as transações em detalhes.

Criação de transações

Podemos criar uma transação usando conexão ou EntityManage. O exemplo abaixo é usado para especificar a criação de conexão e salvar os dados dentro dela.

import {getConnection} from "typeorm"; 
await getConnection().transaction(async transactionalEntityManager => { 
   await connection.manager.save(students); 
});

EntityManager é mostrado abaixo -

import {getManager} from "typeorm";

await getManager().transaction(async transactionalEntityManager => { 
   await transactionalEntityManager.save(students); 
});

Decoradores

Temos três tipos de decoradores relacionados a transações no TypeORM.

  • @Transaction - Envolve toda a execução em uma única transação de banco de dados.
  • @TransactionManager- Usado para executar consultas dentro da transação. É definido abaixo,
@Transaction({ isolation: "SERIALIZABLE" }) 

save(@TransactionManager() manager: EntityManager, student: Student) {     
   return manager.save(student); 
}

Aqui,

Nós costumavamos SERIALIZABLE nível de isolamento para transação.

  • @TransactionRepository- Usado para injetar transação no repositório. É definido abaixo,
@Transaction() save(student: Student, @TransactionRepository(Student) studentRepository: 
Repository<Student>) { 
   return studentRepository.save(student); 
}

Transação em QueryRunner

QueryRunner é usado para executar todas as consultas de banco de dados. Ele tem uma única conexão de banco de dados. A transação do banco de dados pode ser organizada usando QueryRunner . Vamos realizar uma única transação usando QueryRunner .

import {getConnection} from "typeorm"; 

// get a connection and create a new query runner 
const connection = getConnection(); const queryRunner = connection.createQueryRunner(); 

// establish real database connection using our new query runner 
await queryRunner.connect(); 

// now we can execute any queries on a query runner, for example: await queryRunner.query("SELECT * FROM students");

Agora, comece a transação usando a instrução abaixo -

await queryRunner.startTransaction();

Em seguida, confirme e reverta a transação usando a instrução abaixo,

try { 
   await queryRunner.commitTransaction(); 
}

Se houver algum erro, ele é tratado por catch (),

catch (err) { 

   // since we have errors lets rollback changes we made await queryRunner.rollbackTransaction(); 
}

Agora, libere o queryRunner conforme abaixo -

finally { 
   
   // you need to release query runner which is manually created: await queryRunner.release(); 
}