TypeORM - Transacciones

Generalmente, la transacción es una unidad lógica responsable de la ejecución de la recuperación y actualización de datos. Esta sección explica las transacciones en detalle.

Creando transacciones

Podemos crear una transacción usando una conexión o EntityManage. El siguiente ejemplo se utiliza para especificar crear conexión y guardar datos dentro de ella.

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

EntityManager se muestra a continuación -

import {getManager} from "typeorm";

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

Decoradores

Tenemos tres tipos de decoradores relacionados con transacciones en TypeORM.

  • @Transaction - Envuelve toda la ejecución en una sola transferencia de base de datos.
  • @TransactionManager- Se utiliza para ejecutar consultas dentro de la transacción. Se define a continuación,
@Transaction({ isolation: "SERIALIZABLE" }) 

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

Aquí,

Nosotros usamos SERIALIZABLE nivel de aislamiento para la transacción.

  • @TransactionRepository- Se utiliza para inyectar transacciones en el repositorio. Se define a continuación,
@Transaction() save(student: Student, @TransactionRepository(Student) studentRepository: 
Repository<Student>) { 
   return studentRepository.save(student); 
}

Transacción en QueryRunner

QueryRunner se utiliza para ejecutar todas las consultas de la base de datos. Tiene conexión de base de datos única. La transacción de la base de datos se puede organizar mediante QueryRunner . Realicemos una sola transacción usando 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");

Ahora, comience la transacción utilizando la siguiente declaración:

await queryRunner.startTransaction();

Luego, confirme y revierta la transacción usando la siguiente declaración,

try { 
   await queryRunner.commitTransaction(); 
}

Si hay algún error, lo maneja catch (),

catch (err) { 

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

Ahora, suelte el queryRunner como se muestra a continuación:

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