Dans cet article, nous verrons comment effectuer un Transaction NestJS TypeORM en utilisant la classe TypeORM QueryRunner. C’est également la méthode recommandée pour gérer les transactions dans NestJS.
Si vous débutez dans l’utilisation de TypeORM avec NestJS, reportez-vous à cet article détaillé sur l’intégration NestJS TypeORM.
1. Le besoin de gestion des transactions
Les transactions sont l’un des concepts les plus importants lors de la gestion des bases de données. Fondamentalement, une transaction est une unité de travail. Nous devons le traiter dans son ensemble. Soit cela arrive complètement, soit cela ne se produit pas.
Par exemple, vous pouvez penser à transférer de l’argent d’un compte à un autre. À première vue, ce processus implique plusieurs étapes telles que le retrait de l’argent du premier compte, puis son transfert sur le compte du destinataire. Le transfert échoue si même une des étapes échoue. Par conséquent, nous devons traiter ces opérations sous la forme de transactions.
2. La propriété ACID des transactions
Une transaction doit avoir les propriétés ci-dessous. Ils sont communément appelés propriétés ACID.
- Atomicité — Cela signifie que les opérations d’une transaction sont une seule unité qui réussit ou échoue.
- Cohérence — Une transaction valide fait passer la base de données d’un état valide à un autre.
- Isolation — Les transactions doivent être isolées. En d’autres termes, les transactions peuvent se produire simultanément. Fondamentalement, les transactions valides ne provoquent pas d’état incohérent. De plus, l’état intermédiaire de la transaction doit être invisible pour les autres transactions.
- Durabilité — Les modifications apportées par une transaction doivent être durables. En d’autres termes, les changements devraient survivre même à une défaillance du système.
3. Gestion des transactions NestJS TypeORM
Les TypeORM le paquet est livré avec le Lien classer. Nous allons injecter cette classe dans notre BibliothèqueService Exemple.
Voir le code ci-dessous :
library.service.tsconstructor(
@InjectRepository(Book)
private bookRepository: Repository<Book>,
private connection: Connection
){}
Les Lien classe réside dans le dactylographie emballer. La déclaration d’importation ci-dessous sera nécessaire.
import { Connection } from "typeorm";
Les Lien L’objet ne représente pas une seule connexion à la base de données. Il pointe essentiellement vers un pool de connexions. Pour faire référence à une seule collection de bases de données, nous utilisons le Exécuteur de requêtes classer. Fondamentalement, chaque instance du QueryRunner est une connexion.
4. Utilisation de la classe QueryRunner
Nous pouvons maintenant utiliser le Lien objet pour créer une transaction.
Voir l’exemple ci-dessous :
async createMultipleBooks(books: Book[]) {
const queryRunner = this.connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
await queryRunner.manager.save(books[0]);
await queryRunner.manager.save(books[1]);
await queryRunner.commitTransaction();
}catch (err) {
await queryRunner.rollbackTransaction();
}finally {
await queryRunner.release();
}
}
Fondamentalement, nous utilisons une instance de QueryRunner pour établir une connexion et démarrer une transaction. Ensuite, nous sauvegardons tous les livres (dans ce cas 2 livres) dans le cadre d’une même transaction. Si quelque chose ne va pas, nous annulons tout. Sinon, nous validons la transaction et libérons la connexion.
Conclusion
Avec cela, nous en avons terminé avec la transaction NestJS TypeORM à l’aide de QueryRunner. Vous pouvez trouver le code pour le même sur Github.
Si vous avez des commentaires ou des questions sur la publication, n’hésitez pas à écrire dans la section commentaires ci-dessous.