Adquira locks em uma ordem global consistente, mantenha as transações curtas, reduza o isolation onde for seguro, e faça retry do perdedor quando um deadlock ainda acontecer. Um deadlock é um ciclo: a transação A segura a linha 1 e espera pela linha 2, enquanto B segura a linha 2 e espera pela linha 1 — nenhuma pode prosseguir, então o DB mata uma.
O ciclo que você deve quebrar
Tx A Tx B
holds row 1 ──── waits ────▶ row 2 (held by B)
▲ │
│ waits │ holds
└────────── row 1 ◀────────────┘
(cycle = deadlock; DB aborts one victim)
