Saltar al contenido

transacción de base de datos nestjs / TypeOrm

Si encuentras algún detalle que te causa duda puedes comentarlo y te ayudaremos lo más rápido posible.

Hay muchas soluciones disponibles, todas deberían basarse en la gestión de transacciones SQL.

Personalmente, creo que la forma más sencilla de lograrlo es utilizar el mismo EntityManager instancia cuando ejecuta código en su base de datos. Entonces puedes usar algo como:

getConnection().transaction(entityManager -> 
    service1.doStuff1(entityManager);
    service2.doStuff2(entityManager);
);

Puedes engendrar un QueryRunner desde un EntityManager instancia que se envolverá en la misma transacción en caso de que ejecute SQL sin procesar fuera de las operaciones ORM. También necesitas engendrar Repository instancias de EntityManager también o ejecutarán código fuera de la transacción principal.

Así es como lo resolví, ya que necesitaba usar un bloqueo pesimista.

Siento que es la forma “Nest” de hacer las cosas, ya que simplemente puede preguntar NestJS para inyectar una instancia de un Typeorm Connection y estás listo para irte.

@Injectable()
class MyService 
  // 1. Inject the Typeorm Connection
  constructor(@InjectConnection() private connection: Connection)  

  async findById(id: number): Promise 
    return new Promise(resolve => 
      // 2. Do your business logic
      this.connection.transaction(async entityManager => 
        resolve(
          await entityManager.findOne(Thing, id, 
            lock:  mode: 'pessimistic_write' ,
          ),
        );
      );
    );
  

Simplemente coloque cualquier otra lógica que necesite dentro del .transaction bloque y listo.

NOTA: DEBE usar el entityManager proporcionado por el .transaction método o de lo contrario no funcionará.

typeorm-transactional-cls-hooked usa CLS (almacenamiento local de continuación) para manejar y propagar transacciones entre diferentes repositorios y métodos de servicio.

@Injectable()
export class PostService 
  constructor(
    private readonly authorRepository: AuthorRepository,
    private readonly postRepository: PostRepository,
  ) 

  @Transactional() // will open a transaction if one doesn't already exist
  async createPost(authorUsername: string, message: string): Promise 
    const author = await this.authorRepository.create( username: authorUsername );
    return this.postRepository.save( message, author_id: author.id );
  

Si te ha resultado de ayuda nuestro post, agradeceríamos que lo compartas con el resto juniors y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *