Concorrência em Banco de Dados – Deadlock no SQL Server
Gabarito: letra E (I, II e III). O cenário descrito é um deadlock clássico: transações em espera circular por recursos bloqueados. O SQL Server possui um mecanismo automático de detecção de deadlock que escolhe uma transação vítima para abortar e liberar os bloqueios (assertiva I). Deadlocks podem envolver mais de duas transações formando ciclos maiores (assertiva II). A ordenação consistente dos acessos a objetos reduz a probabilidade de deadlock, pois evita a formação de ciclos (assertiva III).
Item I — ✅ Correto
O SQL Server (e a maioria dos SGBDs relacionais) possui um monitor de deadlock que periodicamente verifica se há ciclos de espera. Ao detectar um deadlock, ele seleciona uma das transações como vítima (geralmente a de menor custo de rollback) e a aborta, liberando os bloqueios para que as demais prossigam. Isso é feito automaticamente, gerando um erro para a transação vítima (erro 1205 no SQL Server).
Item II — ✅ Correto
Deadlocks não se limitam a duas transações. É possível que três ou mais transações formem um ciclo de espera. Por exemplo: T1 bloqueia recurso A, T2 bloqueia recurso B, T3 bloqueia recurso C, e depois T1 espera por B, T2 espera por C, T3 espera por A. O mecanismo de detecção resolve da mesma forma.
Item III — ✅ Correto
Uma das principais estratégias para prevenir deadlocks é estabelecer uma ordem global de acesso aos recursos. Se todas as transações acessarem os objetos na mesma sequência (por exemplo, sempre linha1 antes da linha2), a espera circular não pode ocorrer, pois cada transação solicitará os bloqueios na mesma ordem, eliminando a possibilidade de ciclo. Embora deadlocks ainda possam ocorrer por outros motivos (como bloqueios de intervalo ou locks de intenção), a ordenação reduz significativamente sua probabilidade.
Conclusão: Todas as três assertivas estão corretas. Portanto, o gabarito é a letra E (I, II e III).