pg-обещание: когда отправляются BEGIN и COMMIT? - PullRequest
1 голос
/ 29 марта 2019

Этот вопрос предназначен для оптимизации задержки.

В pg-обещании, когда и как команды BEGIN и COMMIT отправляются при использовании транзакций?

Например, если есть код:

db.tx(t => {
    const query1 = t.none(...);
    const query2 = t.none(...);
})

Будет ли команда BEGIN отправлена ​​вместе с первым запросом или ранее в отдельном пакете? Аналогично, команда COMMIT будет отправлена ​​вместе со вторым запросом или после?

Другими словами, будет ли эта транзакция совершать 2, 3 или 4 раунда?

1 Ответ

1 голос
/ 29 марта 2019

Я - автор библиотеки.

Будет ли команда BEGIN отправлена ​​вместе с первым запросом или раньше, в отдельном пакете?

ДО.

Будет ли команда COMMIT отправлена ​​вместе со вторым запросом или после?

ПОСЛЕ.

Будет ли эта транзакция совершать 2, 3 или 4 поездки в оба конца?

4

Вы бы сказали, что есть место для оптимизации или что с использованиемможет быть полезна библиотека нижнего уровня (для задержки)?

Могут быть некоторые, в зависимости от того, чего вы пытаетесь достичь.Реализация по умолчанию позволяет легко / стандартно обрабатывать логику транзакции и регистрировать все, что происходит (см. pg-monitor ).Все оптимизировано в методе tx, что упрощает логическую безопасную обработку любой ситуации.

Единственная ситуация, когда вы хотите оптимизировать ее, если вам необходимо выполнить огромное количество микротранзакцийпотому что в противном случае это не стоит делать с точки зрения производительности.

В таком особом случае, как этот, вы можете выполнить всю транзакцию как один запрос, объединяя все запросы в один.Для этого существует метод helpers.concat , который помогает динамически создавать такой объединенный запрос.

Стоит отметить, что если вам нужны вложенные транзакции, то вы больше не сможете их оптимизировать,поскольку логика вложенных транзакций глубоко зависит от логики отдельных запросов, которые переводятся в обещания, а затем объединяются в цепочки, что согласуется с логикой транзакций PostgreSQL.Если вы попытаетесь обойти это, скорее всего, все рухнет, поскольку вложенные транзакции, как правило, слишком сложны, чтобы обрабатывать их вручную.

...