¿Por qué esta query no usa el índice?
Te preguntan "¿por qué esta query no usa el índice?". Las causas típicas: una función sobre la columna (`WHERE lower(email) = ...` sin índice funcional), un tipo de dato que no matchea, o el planner decidiendo que un seq scan es más barato porque la tabla es chica.
¿Repeatable Read alcanza para evitar write skew?
Confundir Repeatable Read con Serializable. En Postgres, Repeatable Read es snapshot isolation y NO previene write skew: dos transacciones que leen el mismo estado y escriben en filas distintas pueden violar una invariante global. Solo Serializable lo evita (a costa de reintentos).
¿Alcanza con validar en la aplicación?
Asumir que validar en la aplicación alcanza. Con dos servicios escribiendo, un job de migración, o dos requests concurrentes, la validación de app se saltea o compite. La invariante crítica va en la base con un constraint; lo demás es UX.