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.