TypeORM - Transactions
Généralement, la transaction est une unité logique responsable de l'exécution de la récupération et des mises à jour des données. Cette section explique en détail les transactions.
Créer des transactions
Nous pouvons créer une transaction en utilisant la connexion ou EntityManage. L'exemple ci-dessous est utilisé pour spécifier créer une connexion et enregistrer les données à l'intérieur.
import {getConnection} from "typeorm";
await getConnection().transaction(async transactionalEntityManager => {
await connection.manager.save(students);
});
EntityManager est montré ci-dessous -
import {getManager} from "typeorm";
await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save(students);
});
Décorateurs
Nous avons trois types de décorateurs liés aux transactions dans TypeORM.
- @Transaction - Entoure toute l'exécution en une seule conversion de base de données.
- @TransactionManager- Utilisé pour exécuter des requêtes dans la transaction. Il est défini ci-dessous,
@Transaction({ isolation: "SERIALIZABLE" })
save(@TransactionManager() manager: EntityManager, student: Student) {
return manager.save(student);
}
Ici,
Nous avons utilisé SERIALIZABLE niveau d'isolement pour la transaction.
- @TransactionRepository- Utilisé pour injecter la transaction dans le référentiel. Il est défini ci-dessous,
@Transaction() save(student: Student, @TransactionRepository(Student) studentRepository:
Repository<Student>) {
return studentRepository.save(student);
}
Transaction dans QueryRunner
QueryRunner est utilisé pour exécuter toutes les requêtes de base de données. Il a une seule connexion à la base de données. La transaction de base de données peut être organisée à l'aide de QueryRunner . Effectuons une seule transaction à l'aide de 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");
Maintenant, démarrez la transaction en utilisant l'instruction ci-dessous -
await queryRunner.startTransaction();
Ensuite, validez et annulez la transaction à l'aide de l'instruction ci-dessous,
try {
await queryRunner.commitTransaction();
}
S'il y a une erreur, elle est gérée par catch (),
catch (err) {
// since we have errors lets rollback changes we made await queryRunner.rollbackTransaction();
}
Maintenant, libérez le queryRunner comme ci-dessous -
finally {
// you need to release query runner which is manually created: await queryRunner.release();
}