Невозможно установить уровень изоляции Nhibernate по умолчанию (например, с помощью сопоставления).

Это была проблема, которая существовала в 3 проектах для меня.

Я пробовал следующее:

<property name="connection.isolation">ReadCommitted</property>

Установить в hibernate.cfg.xml

Используя беглый nhiberate:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted);

Установить в global.asax.cs

Я всегда был вынужден установить это так:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted);

который работает. (Я вижу это с помощью NHibernate Profiler)

Проблема в том, что сейчас я использую четкую архитектуру и транзакцию. В этой среде вызывается метод Begin, и у меня возникают проблемы при его восстановлении.

Есть ли способ сделать это, который работает без явной настройки, когда вы начинаете транзакцию?

2 ответа

Решение

Вы уверены, что это так? Если вы проверяете уровень изоляции только по тому, что говорит вам NHProf; это может быть проблемой. Помните, что NHProf сообщает только о том, что питает инфраструктура ведения журналов в NHibernate. Возможно, сообщение об уровне изоляции не отправляется при открытии транзакции по умолчанию? Вероятно, это можно проверить, изучив источник NHibernate.

Я бы предложил использовать альтернативные средства для проверки уровня транзакции (возможно, SQL Profiler?), Прежде чем сделать вывод, что это не работает так, как ожидалось.

Редактировать:

Я посмотрел на источник NHibernate и могу проверить мои догадки выше. Если вы посмотрите на источник AdoTransaction, вы заметите, что он регистрирует уровень изоляции IsolationLevel.Unspecified, когда транзакция запускается без указания определенного уровня изоляции.

// This is the default overload you're calling:
public void Begin()
{
Begin(IsolationLevel.Unspecified);
}

// This is the full method impl
public void Begin(IsolationLevel isolationLevel)
{
// snip....

// This is the problematic line here; it will report an isolationLevel of Unspecified.
log.Debug(string.Format("Begin ({0})", isolationLevel));

// snip...

}

Однако фактическая транзакция запускается с уровнем изоляции, указанным в конфигурации, на несколько строк ниже:

if (isolationLevel == IsolationLevel.Unspecified)
{
isolationLevel = session.Factory.Settings.IsolationLevel;
}

Таким образом, кажется, что NHProf не совсем точен в этом случае.

Обновить:

Похоже, это было исправлено в транковой версии NHibernate, так что я думаю, что это больше не проблема с NHibernate 3.xx.

Похоже, настройки вашего свойства должны называться hibernate.connection.isolation...

<add key="hibernate.connection.isolation" value="ReadCommitted" />

С уважением

Джон

Другие вопросы по тегам