Лучшее решение - использовать хранимые процедуры для контроля доступа к данным, чтобы вы могли напрямую писать код TSQL. nHibernate может просто выполнять вызовы хранимых процедур.
Однако, так как это решение почти никогда не летает, вы можете попробовать лечить симптомы. Во-первых, убедитесь, что у вас есть хорошие индексы для таблиц, чтобы запросы, выполняемые из nHibernate, работали так хорошо, как могли. Во-вторых, если вы работаете с SQL SErver 2008+, используйте изоляцию моментального снимка для чтения. Это будет иметь огромное значение в блокировке и блокировке, которые вы видите, оба из которых приводят к взаимоблокировкам.
В примечании для стороны установите сервер как оптимизированный для специальной рабочей нагрузки. Это в корне поможет управлению памятью и кешем процедур.