Невозможно установить уровень изоляции Nhibernate по умолчанию (например, с помощью сопоставления). - PullRequest
6 голосов
/ 13 сентября 2010

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

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

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

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

Использование беглого ниберата:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted);

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

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

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted);

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

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

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

Ответы [ 2 ]

7 голосов
/ 30 сентября 2010

Вы уверены, что это так?Если вы проверяете уровень изоляции только по тому, что говорит вам 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.

0 голосов
/ 13 сентября 2010

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

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

С уважением

Jon

...