Вы можете попробовать применить оптимистическую блокировку следующим образом:
Объект БД будет иметь версию объекта отслеживания столбца ( nhibernate.info ссылка ).
Если вы получаете исключение «устаревшая версия» при сохранении сущности (= изменено другим пользователем) - перезагрузите сущность и попробуйте снова. Затем отправьте обновленное значение клиенту.
Насколько я понимаю, ваш сервер получает запрос от клиента, затем открывает сеанс, вносит некоторые изменения и обновляет сущности, закрывая сеанс. В этом случае ни один поток не будет удерживать один объект в памяти слишком долго, и конфликты оптимистической блокировки не должны возникать слишком часто.
Таким образом, вы можете избежать многих заблокированных потоков, ожидающих завершения операции.
С другой стороны, если вы ожидаете, что повторные попытки будут происходить слишком часто, вы можете попробовать блокировку SELECT FOR UPDATE при загрузке вашей сущности (используя LockMode.Upgrade в методе NH Get). Хотя я нашел поток, который не рекомендует мне использовать это с SQL Server: SO link .
В целом решение зависит от логики игры и от того, можете ли вы разрешить конфликты параллелизма в своем коде, не показывая сообщения пользователям. Я также сделал так, чтобы пользовательский интерфейс обновлялся до самых последних данных достаточно часто, чтобы игроки не действовали в устаревшей игровой ситуации, а затем был удивлен результатом.