Приходилось применять такой подход. Сервис обрабатывал объект, в случае отката транзакции надо было выставить статус ошибки на объекте. Делал через transactionTemplate с выставленным Propagation.REQUIRES_NEW. Для меня тут отдельный сервис избыточен.
Да, вы правы, будет использован. Если я правильно понимаю PostgreSQL, то индекс будет использован практически всегда, так как селиктивность функции без статистики есть константа (вроде бы 1% или 5%). А это значит, что планировщик загнан в угол, даже если в таблице только 100 миллионов записей, подходящих под lower(name) = 'vasya'. Но в принципе такой индекс имеет право на жизнь, все-таки это пользователи…
Жаль, что не имею права голоса.
Можете посоветовать литературу по классике?
Не окажется. PostgreSQL не использует статистику для частичных-индексов, а это значит, что
будет планироваться с селективностью по умолчанию. См. рассылку