#node.js #typescript #postgresql #race-condition #typeorm
#node.js #машинописный текст #postgresql #состояние гонки #типоорм
Вопрос:
Я использую typeorm
с базой postgresql
данных.
Конкретный маршрут, требующий транзакций в высоконагруженном веб-приложении:
import { Router, Request, Response } from 'express';
import { getManager } from 'typeorm';
const router = Router();
router.post('/apply', async (request: Request, response: Response) => {
await getManager().transaction('SERIALIZABLE', async (txManager) => {
/* Many selects, inserts here */
});
});
Но если есть два одновременных запроса, то в одном запросе будет ошибка с сообщением could not serialize access due to read/write dependencies among transactions
.
Как это предотвратить? Может быть, обрабатывать каждый запрос один за другим? Но я не знаю, как это сделать. Возможно, есть какие-то другие способы выполнения транзакций, но я прочитал документацию и ничего не нашел для этого.
Ответ №1:
С уровнем SERIALIZABLE
изоляции вы не предотвращаете ошибки сериализации, но вы повторяете транзакцию, если возникает такая ошибка.