Usa bloqueo optimista en la mayoría de los casos: dale a la fila una columna de versión o una marca de tiempo, inclúyela en el predicado del update y, si se actualizan cero filas, es que el registro cambió por debajo y devuelves un conflicto. Usa bloqueo pesimista, un select for update dentro de una transacción corta, cuando los conflictos son frecuentes o la operación no se puede reintentar con seguridad. Lo que no puedes hacer es leer, modificar y escribir sin ninguna comprobación.
Por qué lo preguntan los entrevistadores
Las actualizaciones perdidas son una clase de corrupción silenciosa de datos que nunca aparece en los tests. El entrevistador quiere ver que conoces el riesgo de leer, modificar y escribir, que eliges estrategia según la contención y no por costumbre, y que entiendes las consecuencias para el usuario: con bloqueo optimista alguien recibe un error y tiene que fusionar, con bloqueo pesimista alguien espera y ahora eres responsable de la vida del bloqueo y del riesgo de interbloqueo.
Cómo estructurar tu respuesta
- Nombra primero el riesgo: leer, modificar y escribir sin protección.
- Describe el bloqueo optimista mecánicamente, incluida la comprobación de cero filas.
- Di cuándo la contención justifica el bloqueo pesimista.
- Explica qué ve el usuario cuando hay conflicto.
Ejemplo de respuesta
El fallo es leer, modificar y escribir: ambas peticiones cargan la versión uno, ambas calculan sobre datos rancios y la segunda escritura gana en silencio. Mi arreglo por defecto es optimista: cada fila tiene una versión, el update dice where id igual a este y version igual a la que leí, e incrementa la versión. Si el update informa de cero filas cambiadas, alguien llegó antes y devuelvo un 409 en vez de fingir que funcionó. Eso no cuesta nada cuando los conflictos son raros, que es lo habitual. Cambio a bloqueo pesimista cuando la contención es real o un reintento es inaceptable, por ejemplo al decrementar inventario, donde tomo un select for update sobre la fila, hago la comprobación y la escritura en una transacción corta, y no dejo ninguna llamada de red dentro de esa transacción. La parte que más me importa es qué ve el usuario. Un error de conflicto en crudo no sirve de nada, así que en un editor de documentos devolvíamos la versión actual junto al error para que el cliente pudiera mostrar un diff en vez de perder el trabajo.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Cómo expondrías un conflicto a través de tu API HTTP?
- ¿Qué riesgos tiene mantener un select for update mientras llamas a otro servicio?
- ¿Qué relación tiene un ETag con if match con el bloqueo optimista?
Más preguntas para Desarrollador backend
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas