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