Código para simular impasse

26

Estou testando meu aplicativo. Preciso de um código estável que simule o impasse no site do banco de dados (script sql, se possível).

Obrigado.

ADICIONADO:

Reprodução de deadlocks envolvendo apenas uma tabela

garik
fonte
2
Não entendi bem a pergunta. Você pode reformular um pouco? Obviamente, as duas pessoas abaixo o entenderam bem o suficiente, mas não estou te seguindo. Você quer dizer código que "de forma estável" simule um impasse? O que você fará depois de um impasse? Você só quer provar que isso pode acontecer?
jcolebrand

Respostas:

29

A melhor maneira seria usar as tabelas que você já possui. Crie duas tabelas - tabela-a, tabela-b. Para um teste, você pode atualizar a mesma coluna com as mesmas informações para não afetar nenhum dado real.

Por exemplo, UPDATE table_a defina ID = ID em que ID = 100;

Abra duas sessões no mesmo banco de dados. Em um, corra

BEGIN TRAN
update table_a set ID=ID where ID = 100;

Em duas corridas

BEGIN TRAN
update table_b set ID=ID where ID =100;

Em seguida, copie as instruções de atualização para as sessões opostas e execute ao mesmo tempo. Em um,

update table_b set ID=ID where ID =100;

Em dois

update table_a set ID=ID where ID = 100;

Eu apenas tentei isso agora e entrei no MS-SQL

Msg 1205, Level 13, State 56, Line 1
Transaction (Process ID 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
David Hall
fonte
7

Use o sp_getapplockprocedimento armazenado do sistema para levar o que for necessário para seu código de exemplo.

A rigor, este é um semáforo Dijkstra . Ainda muito útil

mrdenny
fonte
sp_getapplocknão lançará um erro. Ele nem vai esperar o tempo limite para expirar, ou (se não houver um timeout), retorno -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd
2

Aqui está outro método semelhante ao postado acima ->

CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT)
CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))

Script a ser usado na janela de consulta nº 1

BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)

Script a ser usado na janela de consulta 2

BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)

Script a ser adicionado à janela de consulta nº 1

INSERT dbo.Tbl2 (id, col) VALUES (111, 555)

Para obter detalhes adicionais sobre isso, consulte http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
fonte