Code pour simuler un blocage

26

Je teste ma demande j'ai besoin de code stable simule l'impasse sur le site de base de données (script SQL si possible).

Merci.

AJOUTÉE:

Reproduction de blocages impliquant une seule table

garik
la source
2
Je ne comprends pas très bien la question. Pouvez-vous le reformuler un peu? Évidemment, les deux personnes ci-dessous vous ont assez bien compris, mais je ne vous suis pas tout à fait. Voulez-vous dire du code qui simule "de manière stable" un blocage? Que ferez-vous après une impasse? Voulez-vous simplement prouver que cela peut arriver?
jcolebrand

Réponses:

29

La meilleure façon serait d'utiliser les tables que vous possédez déjà. Créer deux tables - table-a, table-b Pour un test, vous pouvez même mettre à jour la même colonne avec les mêmes informations afin de ne pas affecter de données réelles.

Par exemple UPDATE table_a set ID = ID où ID = 100;

Ouvrez deux sessions sur la même base de données. Sur un, exécutez

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

Sur deux pistes

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

Copiez ensuite les instructions de mise à jour dans les sessions opposées et exécutez-les en même temps. Dans une,

update table_b set ID=ID where ID =100;

En deux

update table_a set ID=ID where ID = 100;

Je viens de l'essayer maintenant et j'ai utilisé 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
la source
7

Utilisez la sp_getapplockprocédure stockée système pour prendre les verrous dont vous avez besoin sur votre exemple de code.

À proprement parler, il s'agit d'un sémaphore Dijkstra . Toujours sacrément utile

mrdenny
la source
sp_getapplockne générera pas d'erreur. Il attendra que le délai expire ou (s'il n'y a pas de délai), retourne -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd
2

Voici une autre méthode similaire à celle publiée ci-dessus ->

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 à utiliser dans la fenêtre de requête # 1

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

Script à utiliser dans la fenêtre de requête # 2

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

Script à ajouter à la fenêtre de requête # 1

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

Pour plus de détails à ce sujet, reportez-vous à http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
la source