Здесь есть пара проблем:
Во-первых, о ваших проблемах с производительностью. Вы уверены, что ISessionFactory создается только один раз? Это очень дорогой объект для создания, поэтому он, вероятно, должен быть одноэлементным в вашем веб-приложении, созданном в Application_Start, а не в Application_BeginRequest. Я думаю, почему у вас такая низкая производительность, что вы создаете новую ISessionFactory для каждого запроса, а не один раз для всего приложения.
Во-вторых, что касается неявных транзакций, они не , что плохо, но из-за того, как вы описываете свой код, вы не должны получать эти ошибки. Вы уверены, что выполняете свои звонки в рамках транзакции? Возможно, вы обращаетесь к некоторым свойствам отложенной загрузки со страниц .aspx и .ascx, которые могут выполняться вне вашей транзакции.