Deadlock - взаимная блокировка: транзакция A ждет ресурс B, B ждет ресурс A. СУБД обнаруживает и откатывает одну из транзакций (жертва). В Go при ошибке "deadlock detected" делают retry с экспоненциальной задержкой. Избегают deadlock: фиксированный порядок блокировки (например, по id), короткие транзакции, минимум блокируемых строк.
for i := 0; i < maxRetries; i++ {
err := doTx(ctx, db)
if err == nil { return nil }
if isDeadlock(err) { time.Sleep(backoff(i)); continue }
return err
}