Способ сделать это в PostgreSQL - использовать уровень изоляции SERIALIZABLE
для всех транзакций.
Тогда вам вообще не понадобится FOR UPDATE
. PostgreSQL не препятствует вставке строк в промежуток, но если две транзакции одновременно читают и записывают значения в один промежуток, одна из них получит ошибку сериализации и должна будет повторить транзакцию (при второй попытке он обнаружит, что пробел не пустой).
Действующая здесь концепция - это сериализуемость: это приемлемо, если кто-то другой вставляет в пробел , не читая (эта транзакция логически после тот, что у вас SELECT
). Но если две транзакции обнаруживают, что промежуток пуст, а затем что-то вставляют, это создаст аномалию, которую предотвращает SERIALIZABLE
.