# #postgresql #go #pgbouncer
Вопрос:
Давайте представим, что у нас есть PostgreSQL и PgBouncer (с режимом транзакций). Также мы планируем выполнить следующую транзакцию:
BEGIN;
UPDATE a ...;
UPDATE b ...;
SELECT c ...;
UPDATE d ...;
COMMIT;
Когда транзакция начинается, PgBouncer предоставляет нам соединение.
Затем мы выполняем:
UPDATE a; -- successful
UPDATE b; -- successful
SELECT a; -- successful
UPDATE d; -- failed, because PgBouncer restarted.
Затем мы пытаемся повторить попытку с помощью клиента go DB
UPDATE d;
В 3-й раз мы получаем соединение и выполняем запрос. Будет ли этот запрос выполнен в той же транзакции или он будет выполнен при новом соединении и приведет к несогласованному состоянию?
Или каждый оператор выполняется с некоторым идентификатором, который может сказать, что он связан с какой-либо транзакцией?
Ответ №1:
Я не могу быть уверен на 100%, так как я не знаком с внутренними функциями PgBouncer или Postgres, но само собой разумеется, что транзакция привязана к соединению, поскольку транзакции не имеют идентификации. Таким образом, до тех пор, пока соединение TCP/SQL не будет перезапущено, вы сможете возобновить его. Но если какое — либо из приложений перезапустится, транзакция исчезнет.
Комментарии:
1. Спасибо за ваш ответ. У меня тоже такое же мнение, но я хотел еще раз перепроверить.