2012-05-03 6 views
2

Прежде всего, я хотел бы знать, какова фактическая основная причина тупиков в SQL Server 2005. Это связано с тем, что, когда два процесса получают доступ к одной и той же строке в таблице?Как удалить взаимоблокировки в SQL Server 2005?

В любом случае рассмотрим две таблицы _Table_Now_ и _Table_History_, где обе имеют одинаковую структуру.

Предположим, что имеется одна колонка под названием NAME.

Таким образом, когда один процесс пытается обновить запись с NAME='BLUE' в _Table_Now_, во-первых, нужно положить настоящую строку с NAME='BLUE' в _Table_History_ затем обновить _Table_Now_, а также удалить ранее настоящую строку из _Table_History_.

При удалении происходит взаимоблокировка. Я не понимаю, почему?

Пожалуйста, направляйте меня!

+2

Тупик обычно включает в себя несколько параллельных транзакций. Вы описали одну транзакцию. Каковы другие транзакции, связанные с тупиком? – NPE

+1

Хорошая практика заключается в том, чтобы избежать мертвых блокировок, предоставляя подсказки для каждого запроса, такие как 'with (NOLOCK)' и 'with (ROWLOCK)', для удаления блокировки вы можете убить один из spids с помощью 'kill N', где n - это spid id, который позволит другому продолжить – AbstractChaos

+0

Без дополнительной информации это будет сложно. Вот ссылка о том, как использовать профилировщик SQL для анализа взаимоблокировок http://msdn.microsoft.com/en-us/library/ms188246.aspx –

ответ

1

тупик в основном в виду, когда процесс А зависит от процесса B и процесса B зависит от способа А, так что А будет просто начать \ продолжить, когда B отделки и B будет только начать \ продолжить, когда А заканчивает

что вы могут испытывать блокировку таблицы (или строки), поэтому SQL блокирует строку перед обновлением таблицы, чтобы убедиться, что другой процесс не пытается получить доступ к этой строке во время обновления.

Можете ли вы уточнить, как вы делаете вставку \ update \ delete. В этом случае у вас не должно быть взаимоблокировок.

FYI, не использовать with (NOLOCK). Это да предотвратит блокировку, но он делает это, сообщая SQL Server о чтении несанкционированных данных и может оказаться в несогласованности данных.

+0

Это моя причина для беспокойства. При нормальных обстоятельствах не должно быть никакого мертвого замка. Даже когда я открываю новое окно Query и пишу простой запрос select, например SELECT * FROM _Table_History_, где NAME = 'BLUE' ... Когда вы выполняете это утверждение несколько раз, он показывает мертвую блокировку. – JackAss

+1

Можете ли вы дать больше информации о том, как происходит тупик? – Diego

+0

Ok.I использую sql server 2005. Теперь в sql server 2005 некоторые соединения выполняются, некоторые спят, но некоторые из них СУЩЕСТВЕННЫ. Когда количество подключений SUSPENDED увеличивается, приложения снижаются. Я выполнил sp_who2 – JackAss

0

Замыкание происходит, когда процесс A ожидает, что процесс B освободит ресурсы, а процесс B ожидает, что процесс A выпустит ресурсы.

Если я понимаю порядок обновления правильно, то это:
1. Прочитайте строку в Table_Now
2. Обновление строки в Table_History
3. Обновление строки в Table_Now
4. Удаление строка в таблице_История.

Это может быть рискованный заказ, если вы используете транзакции или блокировки неправильно.

Чтобы избежать тупиков, для каждого процесса необходимо выполнить:
1. Начало транзакции (предпочтительно блокировка таблицы)
2. Выполните все операции DB
3. Подтверждает транзакцию (или Откат в случае, если любая проблема возникает в то время как обновление БД)

Это гарантирует, что каждый процесс блокирует обе таблицы, выполняет все операции и затем выходит.

Если вы уже используете транзакции, то какой объем и уровень вы используете? Если нет, введите транзакции. Он должен решить проблему.

+1

В описанных сценариях транзакции - это надежный способ создания взаимоблокировок :) Обычно вы можете избежать их использования (updlock) намека на шаге 1 - прочитайте Table_Now. – Arvo

+0

Причина, по которой я не использовал вышеуказанное. Я бы потерял входящую запись, если кто-либо из вышеперечисленного не работает. предположим, что удаление не удалось. Если при откате, то все возвращаются. вставка в _Table_Now_ имеет очень высокий приоритет – JackAss