Если все, что вы читаете, выполняется с помощью IsolationLevel из Serializable, а все записи также выполняются с помощью IsolationLevel из Serializable, я не понимаю, зачем вам нужно самостоятельно блокировать строки базы данных.
Таким образом, сериализация сохраняет данные в безопасности, теперь у нас все еще есть проблема возможных мертвых блокировок ....
Если взаимоблокировки встречаются не часто, достаточно просто поместить [запустить транзакцию, прочитать, обновить, сохранить] в цикл повторных попыток, когда вы получите взаимоблокировку.
В противном случае простой оператор «выбрать для обновления», сгенерированный напрямую (например, не с помощью nhibernate), можно использовать для остановки другой транзакции, считывающей строку до ее изменения.
Однако я продолжаю думать, что, если частота обновления достаточно высока, чтобы получить много взаимоблокировок, ORM может не быть подходящим инструментом для обновления, или может потребоваться изменить схему базы данных, чтобы избежать значения, которое должно быть прочитано / записано (например, вычисление при чтении данных)