Deadlock acontece quando dois ou mais processos são impedidos de prosseguir pois um estar bloqueando o outro, como exemplo, duas pessoas estão querendo usar o mesmo telefone para ligar para números diferentes, enquanto uma delas não ceder sua vez, nenhuma irá conseguir ligar.
No nível de transações de banco de dados não é muito diferente, teremos duas tabelas em nosso banco de dados:
CREATE TABLE Pagamentos (ID INT PRIMARY KEY) GO CREATE TABLE Contas (ID INT PRIMARY KEY) GO
Agora, imagine que um cliente, o senhor 52, irá abrir uma transação para inserir um registro na tabela de pagamentos:
BEGIN TRAN GO INSERT INTO Pagamentos VALUES(1) GO
E ao mesmo tempo, outro cliente, o senhor 55, irá inserir um registro na tabela de contas:
BEGIN TRAN GO INSERT INTO Contas VALUES(1) GO
Até ai, tudo bem, as transações estão abertas, o senhor 55 e o senhor 52 estão utilizando tabelas totalmente diferentes. Mas o senhor 55 lembra que além de inserir um registro na tabela de contas, ele precisa inserir um registro na tabela de pagamentos na mesma transação, assim ele terá que esperar que o senhor 52 termine a transação dele primeiro.
INSERT INTO Pagamentos VALUES(1) GO
Por enquanto nada crítico, é só um cliente esperando o outro terminar.
Mas o senhor 52 também inventa de querer inserir um registro na tabela de Contas:
INSERT INTO Contas VALUES(1) GO
Dai acontece o Deadlock, o senhor 52 esperando o senhor 55 terminar a transação dele, e o senhor 55 esperando o senhor 52. Como se trata de uma Deadlock bem simples, o SQL Server vai rapidamente escolher qual dos dois clientes tem a preferência, e por consequência definirá sua vítima, que é o cliente que terá que morrer para que aquele que possui preferência consiga terminar seu processo.
E assim, no meu cenário, senhor 52 foi brutalmente assassinado (a transação sofre um ROLLBACK pelo próprio SQL Server, de forma que todos os rastros da vítima sejam apagados):
Msg 1205, Level 13, State 47, Line 4
Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
E em homenagem a todos os processos que diariamente são vítimas de Deadlock:
|| EDIT 2012-03-29
|| Via: http://pessoalex.wordpress.com/2012/03/29/exemplo-de-deadlock-no-sql-server/