Поведение и причины того, как уровни изоляции работают в PostgreSQL, обобщены в их документации: https://www.postgresql.org/docs/9.5/transaction-iso.html#XACT -READ-COMMITTED ). С
С моей точки зрения, важно то, что PostgreSQL использует оптимистическую блокировку c для обработки транзакций. Когда транзакция запущена, делается снимок, и он работает с этим. Ручное использование SELECT ... FOR UPDATE
означает использование блокировки pessimisti c для строки.
Теперь, когда вы используете RepeatableRead
, база данных обещает, что изоляция транзакции гарантирована.
Когда TX1
пессимистически блокирует строку, TX2
ожидает, что будет дальше. Если TX1
откатывается, то TX2
может продолжаться. Но поскольку TX1
фиксирует, то TX2
не имеет других возможностей, кроме отката и выдает исключение, чтобы выполнить обещание уровня изоляции.
Здесь вы можете повторно выполнить запрос SQL который увидит обновленную версию состояния базы данных.
Так что для ответа на ваш вопрос
Есть ли способ иметь SELECT в блоке TX2, пока TX1 не будет завершен , а затем ВЫБЕРИТЕ новую обновленную строку?
Да, используйте RepeatableRead
, а когда запрос TX2
не удастся, повторите запрос еще раз.