транзакция node-postgres, использующаяся в цепочке обещаний и все

https://node-postgres.com/features/transactions Я попытался реализовать некоторые API-интерфейсы транзакций для моего проекта с использованием pg, следуя приведенной выше документации. Но одна вещь всплывает у меня из головы, может ли одно соединение (клиент) проводить две транзакции параллельно?

Например, я создаю одну транзакцию по запросу ('BEGIN'), и в этой транзакции у меня будет PromiseChain1, где на каждом шаге будет выполняться sql. последний шаг - выполнить запрос ('COMMIT') и перехватить (err => query ('ROLLBACK'))

псевдокод: BEGIN.then (SQL1_1) .then (SQL1_2) .then (SQL1_3) .then (COMMIT) .catch (ROLLBACK)

И я снова создам еще одну транзакцию по запросу ('BEGIN'), и, как и в предыдущей, будет создана еще одна PromiseChain2, аналогичная предыдущей. псевдокод: BEGIN.then (SQL2_1) .then (SQL2_2) .then (COMMIT) .catch (ROLLBACK)

Последнее, что я сделаю, это вызову Promise.all ([promiseChain1, promChain2]). Then (...)

в зависимости от времени выполнения каждого оператора sql порядок двух BEGIN, двух COMMIT / ROLLBACK и других операторов sql из обеих цепочек может быть случайным, верно?

BEGIN
SQL1_1
        BEGIN
SQL1_2
        SQL2_1
        SQL2_2
        COMMIT
SQL1_3
ROLLBACK

Но поскольку две «транзакции» фактически используют одно и то же соединение, я думаю, что результат будет сильно отличаться от того, что я ожидал.

Может ли кто-нибудь уточнить, будет ли это проблемой, используя концепцию транзакции pg с цепочкой обещаний и всем остальным?


person Ming Zhu    schedule 05.04.2018    source источник
comment
Простой ответ - нет, вы не можете этого сделать. Логика двух транзакций будет пересекаться. Для параллельного выполнения двух транзакций необходимы два отдельных соединения.   -  person vitaly-t    schedule 05.04.2018


Ответы (1)


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

введите описание изображения здесь

person Vignesh    schedule 05.04.2018