Нулевые взаимоблокировки - это в общем случае невероятно дорогостоящая проблема в общем случае, потому что вы должны знать все таблицы / obj, которые вы собираетесь читать и изменять для каждой запущенной транзакции (включая SELECT). Общая философия называется упорядоченная строгая двухфазная блокировка (не путать с двухфазной фиксацией) (http://en.wikipedia.org/wiki/Two_phase_locking; даже 2PL не гарантирует отсутствие тупиков)
Очень немногие СУБД действительно реализуют строгий 2PL из-за огромного снижения производительности, которое вызывает такая вещь (бесплатных обедов нет), в то время как все ваши транзакции ждут выполнения даже простых операторов SELECT.
В любом случае, если это то, что вас действительно интересует, взгляните на SET ISOLATION LEVEL
в SQL Server. Вы можете настроить это по мере необходимости. http://en.wikipedia.org/wiki/Isolation_level
Для получения дополнительной информации см. Википедию по сериализуемости: http://en.wikipedia.org/wiki/Serializability
Тем не менее, отличная аналогия похожа на ревизии исходного кода: регистрируйтесь рано и часто. Сделайте ваши транзакции небольшими (количество операторов SQL, количество строк изменено) и быстрыми (время настенных часов помогает избежать столкновений с другими). Было бы неплохо сделать много вещей за одну транзакцию - и в целом я согласен с этой философией - но если вы испытываете много тупиков, вы можете разбить транс на более мелкие, а затем проверяйте их статус в приложении по мере продвижения. TRAN 1 - OK Да / Нет? Если Д, отправить TRAN 2 - ОК, Д / Н? и т. д.
Кроме того, за многие годы работы администратором баз данных, а также разработчиком (многопользовательских приложений баз данных, измеряющих тысячи одновременно работающих пользователей), я никогда не считал взаимоблокировки такой серьезной проблемой, что мне нужно было ее осознать (или менять уровни изоляции волей-неволей и т. д.).