DBAtlas · Atlas d'exploitation des bases de données

Interblocage / conflit de verrous (ORA-00060, 1213, 40P01)

Vous avez rencontré un interblocage (Oracle ORA-00060, MySQL 1213, PG 40P01, MSSQL 1205). Capturez le graphe, identifiez le schéma, empêchez la récidive. Les interblocages se résolvent par la conception — l'objectif est de réduire leur fréquence.

Capturez d'abord le deadlock graph

Quelles sessions (deux ou plus), quelles ressources, quels modes de verrou sont entrés en collision ? N'appliquez pas de corrections à l'aveugle sans avoir vu cela.

-- Check the trace file referenced in the alert log (deadlock graph). For history:
SELECT * FROM dba_hist_active_sess_history WHERE event LIKE 'enq: TX%' ORDER BY sample_time DESC FETCH FIRST 20 ROWS ONLY;
  • J'ai le graphe — deux transactions verrouillent des ressources dans l'ordre inverse
  • De nombreuses transactions s'accumulent sur une seule ligne/table (hotspot)
  • Il y a des verrous de plage étendus (de nombreuses lignes sont verrouillées)

La requête qui verrouille utilise-t-elle un index ?

Sans index, un UPDATE/DELETE verrouille de nombreuses lignes (voire toute la table) pour satisfaire la clause WHERE → source d'interblocages. Vérifiez son plan.

EXPLAIN <the UPDATE/DELETE involved in the deadlock>;  -- type=ALL means a full scan, no index
  • Pas d'index / elle fait un full scan
  • Il y a un index, mais le conflit persiste

Cause racine : ordre de verrouillage inversé

La cause d'interblocage la plus fréquente : deux transactions accèdent aux ressources dans des ordres différents. Quand A→B et B→A se produisent en même temps, elles s'interbloquent.

Cause racine : index manquant → verrous étendus

Un UPDATE/DELETE sans index verrouille plus de lignes que nécessaire et rend les interblocages bien plus probables.

Cause racine : hotspot

De nombreuses transactions s'accumulent en même temps sur une seule ressource comme une ligne/clé de compteur.

Ouvrir dans DBAtlas →