6

Bu benim için 3 projede var olan bir sorun oldu. Akıcı NHibernate kullanarak hibernate.cfg.xmlVarsayılan Nhibernate yalıtım düzeyi ayarlanamıyor (örn. Haritalama yoluyla)

yılında

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

Set:

Aşağıdaki denedim global.asax.cs

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted); 

Set

Her zaman böyle ayarlamak zorunda kaldım:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted); 

hangi çalışır. (Bunu NHibernate Profiler kullanarak görebilirim)

Sorun şu anda keskin mimariyi ve işlemeyi kullanıyorum.begin bu çerçevenin içinde çağrılıyor ve bunu yeniden oluşturma konusunda sorun yaşıyorum.

İşlem yapmaya başladığınızda açıkça ayarlamadan çalışan bir yolu var mı? Mülk ayarı gibi

cevap

7

Durumun bu olduğundan emin misiniz? Yalnızca NHProf'un size söylediği yalıtım düzeyini doğrulıyorsanız; Bu bir sorun olabilir. NHProf'un sadece NHibernate'deki günlüğe kayıt altyapısının onu beslediğini rapor ettiğini unutmayın. Varsayılan olarak bir işlem açtığınızda izolasyon seviyesi mesajı gönderilemez mi? Bu muhtemelen NHibernate kaynağını araştırarak doğrulanabilir.

Bu işlemin beklendiği gibi çalışmadığı sonucuna varmadan önce işlem düzeyini (belki de SQL Profiler?) Doğrulamak için alternatif bir yöntem kullanmanızı öneririm.

Düzenleme: NHibernate kaynağında bir göz yaşadım ve yukarıda benim önsezi doğrulayabilir

. AdoTransaction kaynağına bir göz attıktan sonra, belirli bir yalıtım düzeyi belirtmeden bir işlem başlatıldığında IsolationLevel.Unspecified yalıtım düzeyinin günlüğe kaydedildiğini unutmayın.

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

} 

Ancak gerçek işlem gibi birkaç satır aşağı config belirtilen yalıtım düzeyi ile başlayan ediliyor:

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

Yani, NHProf içinde tamamen doğru olmak değildir gibi görünüyor bu örnek

Güncelleme:

NHibernate gövde sürümünde düzeltildi görünür, bu yüzden bu artık NHibernate 3.xx. ile ilgili bir sorun olduğunu tahmin ediyorum

+0

Harika cevap! Teşekkür ederim! – Alistair

+0

@Alistair: Bunu nhprof grubunda da belirtmiştim, ama sanırım NH 2.x kullanıcıları için bu konuda hiçbir şey yapamayacağım/... http://groups.google.com/group/nhprof/browse_thread/iplik/b8ceb8f8c1cdb4d3 – DanP

0

görünüyor ... hibernate.connection.isolation

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

Saygılar

çağrılmalıdır

Jon

+2

Web.config dosyasında nhibernate ayarlarınız varsa bu gereklidir. Bunları harici bir dosyada varsa, yukarıda belirtilen formatı kullanırsınız. – Alistair

İlgili konular