БД блокирует все строки, которые мы читали раньше, только если это требуется. REPEATABLE READ
уровень изоляции - минимальный уровень, требующий его. Из документов PG:
Read Committed - уровень изоляции по умолчанию в PostgreSQL. Когда транзакция использует этот уровень изоляции, запрос SELECT (без предложения FOR UPDATE / SHARE) видит только данные, зафиксированные до начала запроса;он никогда не видит ни незафиксированные данные, ни изменения, зафиксированные во время выполнения запроса параллельными транзакциями. По сути, запрос SELECT видит снимок базы данных с момента начала выполнения запроса. Однако SELECT видит результаты предыдущих обновлений, выполненных в пределах его собственной транзакции, даже если они еще не зафиксированы. Также обратите внимание, что две последовательные команды SELECT могут видеть разные данные, даже если они находятся в одной транзакции, если другие транзакции фиксируют изменения после запуска первого SELECT и до запуска второй SELECT.
Так что в случаевы работаете с REPEATABLE READ +
уровнем изоляции, обновление будет выполнено успешно (версия «стабильная»), но в случае, если другая транзакция изменила поле версии, ваша транзакция не будет зафиксирована.
В случае запуска с READ COMMITTED
уровень изоляции и другая транзакция изменяет поле версии до того, как вы это сделаете, ваш UPDATE ничего не обновит (executeUpdate
вернет 0). Таким образом, вы можете проверить это и действовать соответствующим образом.
Итог, можно использовать обе опции, но поведение не одинаково, и ваш код должен вести себя по-разному. Если вы используете ORM, внимательно проверьте его поведение.