Transacciones

El uso de transacciones en base de datos es necesario si nos queremos asegurar que todas las operaciones son realizadas correctamente.

Las transacciones solo funcionan, si la implementación del ICommandBus no es serializada, esto quiere decir que en un entorno de microservicios que estén comunicados por messages brokers, no podremos usar transacciones la perderse la referencia de la transacción en la serialización.

import { Sequelize } from 'sequelize-typescript';

constructor(
        private readonly commandBus: ICommandBus,
        private readonly queryBus: IQueryBus,
        private readonly sequelize: Sequelize,
    ) {}
    
    async main(
        payload: OrionCreateTransportInput | OrionCreateTransportDto,
        timezone?: string,
    ): Promise<OrionTransport | OrionTransportDto>
    {
   const transaction = await this.sequelize.transaction({
            // logging: console.log,  // Just for debugging purposes
        });

        try
        {
            // create transport
            await this.commandBus.dispatch(new CreateTransportCommand(
                {
                    ...payload,
                },
                { timezone, repositoryOptions: { transaction }},
            ));

            // loadOrders
            await this.commandBus.dispatch(new DeleteLoadOrdersCommand(
                { where: { transportId: payload.id }},
                {},
                { timezone, repositoryOptions: { transaction }},
            ));

            await transaction.commit();
        }
        catch (error)
        {
            await transaction.rollback();
            throw error;
        }
        
     }
}

Última actualización