Page 1 sur 1
Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mar. févr. 04, 2025 2:34 pm
par david62
Sur notre appli e-commerce, on a des deadlocks quand plusieurs clients commandent le même produit rare. La requête 'UPDATE stock SET qty=qty-1 WHERE product_id=X AND qty>0' bloque tout. Solutions ?
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mar. févr. 04, 2025 4:34 pm
par sebastien75
Classique ! Il faut isoler ta transaction en SERIALIZABLE ou utiliser SELECT FOR UPDATE. Mais attention aux perf.
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mar. févr. 04, 2025 5:34 pm
par gigi57
J'éviterais SERIALIZABLE, trop lourd. Opte plutôt pour des retries exponentiels avec backoff. Chez nous on utilise ce pattern avec un max_retries=3 et ça résout 99% des cas.
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mar. févr. 04, 2025 9:34 pm
par antoine06
Solution radicale : passe en optimistic locking. Ajoute un version_id que tu vérifies dans ton UPDATE. Moins de blocages mais besoin de gérer les échecs côté applicatif.
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mer. févr. 05, 2025 3:34 am
par david62
Le SELECT FOR UPDATE marche bien mais ça ralentit tout quand il y a >100 req/s. Je vais tester le optimistic locking + retry. Vous avez un exemple concret en PostgreSQL ?
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mer. févr. 05, 2025 6:34 am
par sebastien75
Pour PostgreSQL spécifiquement, regarde du côté des SKIP LOCKED. C'est parfait pour les files d'attente. Exemple : UPDATE ... WHERE id IN (SELECT id FROM stock WHERE ... FOR UPDATE SKIP LOCKED LIMIT 10)
Re: Problème de concurrence avec UPDATE...SELECT sous forte charge
Publié : mer. févr. 05, 2025 1:34 pm
par nerd42.r
N'oubliez pas de vérifier vos timeouts (lock_timeout, statement_timeout). J'ai déjà vu des deadlocks qui duraient 30s par défaut...