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