Retry e idempotência após um timeout: teste com SQLite mostra a duplicação depois do commit, o bloqueio por chave e os limites da transação local.