Типовая и постгресс-взаимоблокировка

#node.js #typescript #postgresql #typeorm

#node.js #typescript #postgresql #типовая

Вопрос:

У меня есть этот код, который выдает ошибку:

Необработанное предупреждение promiserejectionwarning: ошибка выполнения запроса readyreleasederror: средство выполнения запроса уже выпущено. Больше не удается запускать запросы.

Вызывающий

 const res = await getManager().transaction(async entityManager => {
    return ServiceA.method1(entityManager);
});
 

Сервис A

 static async method1(entityManager: EntityManager) {
    const deleteResult = await entityManager //changing this line to getManager() fixes the issue, but in other situations it still comes back
        .createQueryBuilder()
        .setLock('pessimistic_write')
        .delete()
        .from(MyEntity)
        .where('relate = :id', { id: some id })
        .execute();

    await ServiceB.method1({
        ...
        entityManager: entityManager
    });

    await ServiceB.method2({
        ...
        entityManager: entityManager
    });
    return true;
}
 

Служба B

 static async method1(params: {
    ...
    entityManager: EntityManager;
}) {
    let lockedEntityOne = await EntityOneDao.getAndLock(..., params.entityManager);
    if (!lockedEntityOne) throw new Error('not found');

    //modify lockedEntityOne

    const aNewRelatedEntityOne = await this._createANewRelatedEntityOne()
    await params.entityManager.save([lockedEntityOne, aNewRelatedEntityOne]);
    return lockedEntityOne;
}

static async method2(params: {
    ...
    entityManager: EntityManager;
}) {
    let lockedEntityTwo = await EntityTwoDao.getAndLock(..., params.entityManager);
    if (!lockedEntityTwo) throw new Error('not found');

    //modify lockedEntityTwo

    const aNewRelatedEntityTwo = await this._createANewRelatedEntityTwo()
    await params.entityManager.save([lockedEntityTwo, aNewRelatedEntityTwo]); //where the above error is thrown
    return lockedEntityTwo;
}
 

В Service A случае, если я изменю строку, в которой используется переданный entityManager с импортом getManager() из пакета ‘typeorm’, тогда конкретный случай будет исправлен. Однако в других ситуациях он возвращается. Я знаю, что это много, но мне интересно, является ли передача entityManager для повторного использования плохой идеей. Любая помощь приветствуется.

Правка 1

Я удалил все блокировки «pessimistic_write» из объектов, но проблема сохраняется. Я до сих пор не понимаю, почему использование нового менеджера разрешает этот конкретный случай и завершается с той же ошибкой в других случаях.