Обновление: Эта недавняя статья MSDN, Инструменты И Методы для Идентификации Проблем Параллелизма , могла бы также представлять интерес
Stephen Toub в мониторе Мертвой блокировки статьи MSDN состояния следующие четыре условия, необходимые, чтобы мертвые блокировки произошли:
ограниченное количество А конкретного ресурса. В случае монитора в C# (что Вы используете при использовании ключевого слова блокировки), это ограниченное количество один, так как монитор является блокировкой взаимного исключения (значение, что только один поток может владеть монитором за один раз).
способность содержать один ресурс и запросить другого. В C# это сродни соединению одного объекта и затем соединению другого прежде, чем выпустить первую блокировку, например:
lock(a)
{
...
lock(b)
{
...
}
}
Никакая возможность вытеснения. В C# это означает, что один поток не может вынудить другой поток выпустить блокировку.
А круговое условие ожидания. Это означает, что существует цикл потоков, каждый из которых ожидает рядом с выпуском ресурс, прежде чем он сможет продолжиться.
Он продолжает объяснять, что способ избежать мертвых блокировок состоит в том, чтобы избежать (или банка) условия четыре.
Joe Duffy обсуждает несколько методов для предотвращения и обнаружения мертвых блокировок, включая одно известное как выравнивание блокировки. В выравнивании блокировки блокировки являются присвоенными численными значениями, и потоки должны только получить блокировки, которые имеют более высокие числа, чем блокировки, которые они уже получили. Это предотвращает возможность цикла. Также часто трудно преуспеть в типичном приложении сегодня, и отказ следовать за блокировкой, выравнивающейся на каждом приобретении блокировки, приглашает мертвую блокировку.
In SQL Server Management Studio
That's it! :)
Попробуйте следующее:
ALTER TABLE dbo.YourTableName
ADD CONSTRAINT
ConstraintName UNIQUE NONCLUSTERED
(
Column01,
Column02,
Column03
)
Я использую названия компаний для ограничений, поэтому, если они нарушаются и возникает исключение, я получаю « Нарушение только одного отдела на сотрудника » в моем сообщении об ошибке, а не « Нарушение ограничения XXX ».