Пакет Go sql, PostgreSQL и PgBouncer с поведением при повторной попытке

# #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. Спасибо за ваш ответ. У меня тоже такое же мнение, но я хотел еще раз перепроверить.