Невозможно установить уровень изоляции 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" />
С уважением
Джон