#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» из объектов, но проблема сохраняется. Я до сих пор не понимаю, почему использование нового менеджера разрешает этот конкретный случай и завершается с той же ошибкой в других случаях.