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();
}