TypeORM - Transazioni

In generale, la transazione è un'unità logica responsabile dell'esecuzione del recupero e degli aggiornamenti dei dati. Questa sezione spiega in dettaglio le transazioni.

Creazione di transazioni

Possiamo creare una transazione utilizzando la connessione o EntityManage. L'esempio seguente viene utilizzato per specificare la creazione della connessione e salvare i dati al suo interno.

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

EntityManager è mostrato di seguito -

import {getManager} from "typeorm";

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

Decoratori

Abbiamo tre tipi di decoratori relativi alle transazioni in TypeORM.

  • @Transaction - Avvolge tutta l'esecuzione nella singola transazione del database.
  • @TransactionManager- Utilizzato per eseguire query all'interno della transazione. È definito di seguito,
@Transaction({ isolation: "SERIALIZABLE" }) 

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

Qui,

Abbiamo usato SERIALIZABLE livello di isolamento per la transazione.

  • @TransactionRepository- Usato per inserire transazioni nel repository. È definito di seguito,
@Transaction() save(student: Student, @TransactionRepository(Student) studentRepository: 
Repository<Student>) { 
   return studentRepository.save(student); 
}

Transazione in QueryRunner

QueryRunner viene utilizzato per eseguire tutte le query di database. Ha una singola connessione al database. La transazione del database può essere organizzata utilizzando QueryRunner . Eseguiamo una singola transazione utilizzando 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");

Ora, avvia la transazione utilizzando la dichiarazione seguente:

await queryRunner.startTransaction();

Quindi, eseguire il commit e il rollback della transazione utilizzando l'istruzione seguente,

try { 
   await queryRunner.commitTransaction(); 
}

Se c'è qualche errore, viene gestito da catch (),

catch (err) { 

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

Ora rilascia il queryRunner come di seguito -

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