2011-10-18 16 views
10

Próbuję więc wyśledzić, co wygląda na problem z zakleszczeniem here. Włączyłem rejestrowanie zakleszczeń za pomocą DBCC TRACEON (1222, -1) i DBCC TRACEON (1204, -1). Chciałbym przetestować, aby upewnić się, że rejestracja złapie zakleszczenie, więc jak mogę spowodować wystąpienie w MS SQL 2005? Dzięki,Jak celowo spowodować zakleszczenie?

+0

Jeśli problem z drugim wpisem to zakleszczenia, a nie blokowanie, należy uzyskać błąd zakleszczenia, a nie błąd przekroczenia limitu czasu. –

Odpowiedz

30

Oto kilka T-SQL, aby celowo spowodować zakleszczenie.

stworzenie obiektu:

CREATE TABLE dbo.DeadLockTest (col1 INT) 
INSERT dbo.DeadLockTest SELECT 1 

CREATE TABLE dbo.DeadLockTest2 (col1 INT) 
INSERT dbo.DeadLockTest2 SELECT 1 

otworzyć nowe okno zapytań i wklej ten kod i uruchomić go:

BEGIN TRAN 
UPDATE dbo.DeadLockTest SET col1 = 1 

Otwórz się kolejny nowy okno zapytań i wklej oraz wykonywać ten kod:

BEGIN TRAN 
UPDATE dbo.DeadLockTest2 SET col1 = 1 
UPDATE dbo.DeadLockTest SET col1 = 1 

Powrót do pierwszego okna zapytania (z pierwszym numerem BEGIN TRAN tement) i wykonaj ten kod:

UPDATE dbo.DeadLockTest2 SET col1 = 1 

Voila! To jest impas.

5

To powinno działać:

  • Włóż dwa rekordy A i B.
  • Otwartych dwóch transakcji.
  • Zaktualizuj rekord A w pierwszej transakcji i B w drugiej transakcji.
  • gdy wiesz na pewno te aktualizacje są wykonywane:
    • Aktualizacja rekordu B w pierwszej transakcji i A w drugiej transakcji.
Powiązane problemy