Как сознательно вызывать тупик?

Итак, я пытаюсь найти что-то вроде проблемы взаимоблокировки здесь. Я включил ведение журнала блокировки с помощью DBCC TRACEON (1222, -1) и DBCC TRACEON (1204, -1). Я бы хотел протестировать, чтобы журнал зашел в тупик, и как я могу заставить его возникнуть в MS SQL 2005? Спасибо,

Ответ 1

Здесь некоторые T-SQL намеренно вызывают тупик.

Создание объекта:

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

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

Откройте новое окно запроса и вставьте этот код и выполните его:

BEGIN TRAN
UPDATE dbo.DeadLockTest SET col1 = 1

Откройте еще одно новое окно запроса и вставьте и выполните этот код:

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

Вернитесь в свое первое окно запроса (с помощью первого оператора BEGIN TRAN) и выполните этот код:

UPDATE dbo.DeadLockTest2 SET col1 = 1

Voila! Это тупик.

Ответ 2

Это должно работать:

  • Вставьте две записи, A и B.
  • Откройте две транзакции.
  • Обновить запись A в первой транзакции и B во второй транзакции.
  • Когда вы точно знаете, что эти обновления сделаны:
    • Обновить запись B в первой транзакции и A во второй транзакции.