6

Das war ein Problem, das bei 3 Projekten für mich existiert hat.Kann keine Standard-Nhibernate-Isolationsstufe einstellen (zB via Mapping)

Ich habe versucht, die folgenden:

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

Set in hibernate.cfg.xml

Mit fließend nhiberate:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted); 

Set in global.asax.cs

Ich war schon immer gezwungen, es so einzustellen:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted); 

was funktioniert. (Ich kann dies mit NHibernate Profiler sehen)

Das Problem ist jetzt, ich benutze scharfe Architektur und transaction.begin wird in diesem Rahmen aufgerufen und ich habe Probleme beim Wiederaufbau.

Gibt es eine Möglichkeit, dies zu tun, ohne beim Start einer Transaktion explizit zu setzen?

Antwort

7

Sind Sie sicher gestellt werden, dass dies der Fall ist? Wenn Sie das Isolationsniveau nur anhand der Angaben von NHProf überprüfen; Das könnte ein Problem sein. Denken Sie daran, dass NHProf nur meldet, was die Protokollierungsinfrastruktur in NHibernate einspeist. Vielleicht wird die Isolationsstufen-Nachricht nicht gesendet, wenn Sie eine Transaktion mit dem Standard öffnen? Dies könnte wahrscheinlich durch Untersuchung der NHibernate-Quelle verifiziert werden.

Ich würde vorschlagen, eine alternative Methode zu verwenden, um die Transaktionsebene (vielleicht SQL Profiler?) Zu überprüfen, bevor Sie feststellen, dass dies nicht wie erwartet funktioniert.

Edit:

ich einen Blick auf die NHibernate Quelle gehabt haben und kann meine Vermutung oben überprüfen. Wenn Sie sich die Quelle AdoTransaction ansehen, werden Sie feststellen, dass sie eine Isolationsstufe von IsolationLevel.Unspecified protokolliert, wenn eine Transaktion gestartet wird, ohne eine spezifische Isolationsstufe anzugeben.

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

} 

Allerdings ist die tatsächliche Transaktion mit der Isolationsstufe gestartet wird in der Config ein paar Zeilen nach unten als solche angegeben:

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

So würde es scheinen, dass NHProf ist nicht ganz korrekt zu sein in diese Instanz.

Update:

Es scheint dies in der Stamm-Version von NHibernate wird behoben, so dass ich vermute, dies ist nicht länger ein Problem mit NHibernate 3.xx.

+0

Super Antwort! Vielen Dank! – Alistair

+0

@Alistair: Ich erwähnte das auch in der nhprof-Gruppe, aber ich vermute, dass nichts darüber für NH 2.x-Benutzer getan werden kann/wird ... http://groups.google.com/group/nhprof/browse_thread/thread/b8ceb8f8c1cdb4d3 – DanP

0

Sieht aus wie Ihr Eigentum Einstellung sollte hibernate.connection.isolation ...

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

Grüße

Jon

+2

Dies ist notwendig, wenn Sie Ihre Nhibernate-Einstellungen in Ihrer web.config haben. Wenn Sie sie in einer externen Datei haben, verwenden Sie das oben angegebene Format. – Alistair