У нас есть служба WCF, которая делает много транзакционных вызовов NHibernate. Иногда мы наблюдали таймауты SQL, хотя звонки обновляли разные строки, а таблицы были установлены на блокировку на уровне строк.
После перекопа в журналы, похоже, что разные потоки вводили одну и ту же точку в коде (наша транзакция с использованием блока), и обновление было зафиксировано на фиксации. Это, однако, не имело смысла, поскольку мы полагали, что следующий атрибут класса обслуживания заставлял уникальный поток выполнения для служебного вызова:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
Недавно мы изменили режим concurrency на ConcurrencyMode.Single
и еще не столкнулись с какими-либо проблемами, но ошибка была очень сложной для воспроизведения (если у кого-то есть мысли о том, чтобы скрыть ошибку, сообщите мне об этом!).
В любом случае, все это подводит меня к моему вопросу: не должен ли InstanceContextMode PerCall обеспечивать безопасность потоков внутри службы, даже если для параметра ConcurrencyMode установлено несколько? Как можно было бы обслуживать два вызова одним и тем же экземпляром службы?
Спасибо!