Вечер добрый. Как бороться с race condition? В несколько потоков клиентский код пытается заселектить, обновить или вставить данные. В таблице уникальный индекс на эти данные. При многопоточном доступе и select for update проскакивает вставка одних и тех же данных. Естественно падает по ограничению целостности. Можно как-то заблокироваться, но не на всей таблице?
Вариант 1. Использовать везде SERIALIZABLE (прочитав в документации, как именно), и получить надёжное решение проблемы.
Вариант 2. Прочитать и осознать (попробовать на примерах) всю документацию про изоляцию в PostgreSQL (про serializable можно при этом не читать), понять механизмы, подумать о возможных взаимодействиях в конкретном случае, придумать и протестировать подход... и, если Вы хоть что-то сделаете неправильно, то проблема просто будет появляться значительно реже. ;)
Для варианта 2 есть набор паттернов, которые часто помогают, а иногда — нет, если что.