Очередь создания СЕРИАЛИЗУЕМОЙ транзакции Postgresql

#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 изоляции вы не предотвращаете ошибки сериализации, но вы повторяете транзакцию, если возникает такая ошибка.