Utilisez le verrouillage optimiste dans la plupart des cas : donnez à la ligne une colonne de version ou un horodatage, incluez-la dans le prédicat de l'update, et si zéro ligne est modifiée, l'enregistrement a changé sous vos pieds, donc vous renvoyez un conflit. Utilisez le verrouillage pessimiste, un select for update dans une transaction courte, quand les conflits sont fréquents ou que l'opération ne peut pas être rejouée sans risque. La seule chose à ne pas faire est de lire, modifier et écrire sans aucune vérification.
Pourquoi les recruteurs posent cette question
Les mises à jour perdues sont une classe de corruption de données silencieuse qui n'apparaît jamais dans les tests. Le recruteur veut voir que vous connaissez le danger du lire-modifier-écrire, que vous choisissez une stratégie selon la contention plutôt que par habitude, et que vous comprenez les conséquences pour l'utilisateur : le verrouillage optimiste veut dire que quelqu'un reçoit une erreur et doit fusionner, le pessimiste veut dire que quelqu'un attend et que vous héritez de la durée de vie des verrous et du risque d'interblocage.
Comment structurer votre réponse
- Nommez d'abord le danger : lire-modifier-écrire sans garde-fou.
- Décrivez mécaniquement le verrouillage optimiste, y compris la vérification du zéro ligne.
- Dites quand la contention justifie le verrouillage pessimiste.
- Traitez ce que voit l'utilisateur en cas de conflit.
Exemple de réponse
L'échec, c'est le lire-modifier-écrire, où les deux requêtes chargent la version un, calculent toutes les deux à partir de données périmées et la seconde écriture gagne en silence. Ma correction par défaut est optimiste : chaque ligne a une version, l'update dit where id égale ceci et version égale ce que j'ai lu, et il incrémente la version. Si l'update signale zéro ligne modifiée, quelqu'un est arrivé avant moi et je renvoie un 409 au lieu de faire comme si ça avait marché. Ça ne coûte rien quand les conflits sont rares, ce qui est le cas d'habitude. Je passe au verrouillage pessimiste quand la contention est réelle ou qu'une reprise est inacceptable, par exemple pour décrémenter un stock, où je prends un select for update sur la ligne, je fais la vérification et l'écriture dans une transaction courte, et je ne garde aucun appel réseau dans cette transaction. Ce qui m'importe le plus, c'est ce que voit l'utilisateur. Une erreur de conflit brute ne sert à rien, donc pour un éditeur de documents on renvoyait la version courante à côté de l'erreur pour que le client puisse afficher un diff au lieu de simplement perdre le travail.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment exposeriez-vous un conflit à travers votre API HTTP ?
- Quels sont les risques à garder un select for update pendant un appel de service ?
- Quel lien y a-t-il entre un ETag avec if match et le verrouillage optimiste ?
Autres questions pour Développeur backend
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions