6

To był problem, który istniał w przypadku 3 projektów dla mnie.Nie można ustawić domyślnego poziomu izolacji Nhibernate (np. Poprzez mapowanie).

Próbowałem następujące:

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

Położony w hibernate.cfg.xml

Korzystanie biegle nhiberate:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted); 

Położony w Global.asax.cs

Zawsze byłem zmuszony ustawić tak:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted); 

który działa. (Widzę to za pomocą NHibernate Profiler)

Problem polega na tym, że używam ostrej architektury i transaction.begin jest wywoływana wewnątrz tej struktury i mam problemy z jej odbudową.

Czy istnieje sposób na wykonanie tej czynności bez jawnego ustawienia jej podczas rozpoczynania transakcji?

Odpowiedz

7

Czy jesteś pewien, że jest to przypadek? Jeśli tylko weryfikujesz poziom izolacji przez to, co mówi NHProf; to może być problem. Pamiętaj, że NHProf raportuje tylko to, co je dostarcza w infrastrukturze logowania w NHibernate. Być może komunikat o poziomie izolacji nie jest wysyłany po otwarciu transakcji z ustawieniem domyślnym? Prawdopodobnie można to sprawdzić, badając źródło NHibernate.

Sugerowałbym użycie alternatywnych metod sprawdzania poziomu transakcji (być może programu SQL Profiler?) Przed stwierdzeniem, że nie działa zgodnie z oczekiwaniami.

Edit:

miałem spojrzeć na źródła NHibernate i może zweryfikować moje przeczucie powyżej. Jeśli spojrzysz na źródło AdoTransaction, zauważysz, że rejestruje on poziom izolacji IsolationLevel.Unspecified, gdy transakcja jest uruchamiana bez określania określonego poziomu izolacji.

// 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... 

} 

Jednak faktyczna transakcja jest uruchamiany z poziomu izolacji określonym w config kilka linii w dół jako takie:

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

tak, to wydaje się, że NHProf nie jest całkowicie dokładne ta instancja.

Aktualizacja:

Wydaje się ten został naprawiony w wersji tułowia NHibernate, więc zgaduję, nie jest to już problem z NHibernate 3.xx.

+0

Niesamowita odpowiedź! Dziękuję Ci! – Alistair

+0

@Alistair: Wspomniałem o tym także w grupie nhprof, ale domyślam się, że nic nie można/zostanie to zrobione dla użytkowników NH 2.x w każdym razie ... http://groups.google.com/group/nhprof/browse_thread/thread/b8ceb8f8c1cdb4d3 – DanP

0

wygląda ustawieniem własności powinien być nazywany hibernate.connection.isolation ...

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

Pozdrowienia

Jon

+2

Jest to konieczne, jeśli masz ustawienia nhibernate w pliku web.config. Jeśli masz je w pliku zewnętrznym, używaj formatu podanego powyżej. – Alistair

Powiązane problemy