6

Đây là vấn đề tồn tại trên 3 dự án đối với tôi.Không thể đặt mức cách ly Nhibernate mặc định (ví dụ: thông qua ánh xạ)

Tôi đã thử những điều sau đây:

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

Set trong hibernate.cfg.xml

Sử dụng thành thạo nhiberate:

MsSqlConfiguration.MsSql2008.IsolationLevel(IsolationLevel.ReadCommitted); 

Set trong global.asax.cs

Tôi luôn bị buộc phải đặt như sau:

CurrentNhibernateSession.Transaction.Begin(IsolationLevel.ReadCommitted); 

hoạt động. (Tôi có thể thấy điều này bằng cách sử dụng NHibernate Profiler)

Vấn đề là bây giờ tôi đang sử dụng kiến ​​trúc sắc nét và transaction.begin được gọi bên trong khuôn khổ đó và tôi gặp khó khăn khi xây dựng lại nó.

Có cách nào để thực hiện tác vụ này mà không đặt rõ ràng khi bạn bắt đầu giao dịch không?

Trả lời

7

Bạn có chắc chắn rằng đây là trường hợp? Nếu bạn chỉ xác minh mức độ cô lập bởi những gì NHProf đang nói cho bạn; đó có thể là một vấn đề. Hãy nhớ rằng NHProf chỉ báo cáo những gì cơ sở hạ tầng đăng nhập trong NHibernate nguồn cấp dữ liệu nó. Có lẽ thông báo mức cô lập không được gửi khi bạn mở một giao dịch với mặc định? Điều này có thể có thể được xác minh bằng cách điều tra nguồn NHibernate.

Tôi khuyên bạn nên sử dụng phương tiện thay thế để xác minh cấp giao dịch (có lẽ là SQL Profiler?) Trước khi kết luận rằng điều này không hoạt động như mong đợi.

Edit:

Tôi đã có một cái nhìn tại nguồn NHibernate và có thể xác minh linh cảm của tôi ở trên. Nếu bạn có một cái nhìn tại các nguồn AdoTransaction bạn sẽ lưu ý rằng nó đang đăng nhập một mức cô lập của IsolationLevel.Unspecified khi một giao dịch được bắt đầu mà không chỉ định một mức cô lập cụ thể.

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

} 

Tuy nhiên, các giao dịch thực tế đã được bắt đầu với mức độ cô lập được quy định trong cấu hình một vài dòng xuống như vậy:

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

Vì vậy, nó sẽ có vẻ rằng NHProf không là hoàn toàn chính xác trong ví dụ này.

Cập nhật:

Có vẻ điều này đã được cố định trong phiên bản cốp NHibernate, vì vậy tôi đoán này không còn là một vấn đề với NHibernate 3.xx.

+0

Câu trả lời thú vị! Cảm ơn bạn! – Alistair

+0

@Alistair: Tôi đã đề cập đến điều này trong nhóm nhprof là tốt, nhưng tôi đoán không có gì có thể/sẽ được thực hiện về điều này cho NH 2.x người dùng anyways ... http://groups.google.com/group/nhprof/browse_thread/thread/b8ceb8f8c1cdb4d3 – DanP

0

vẻ như thiết lập tài sản của bạn nên được gọi là hibernate.connection.isolation ...

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

Trân

Jon

+2

Điều này là cần thiết nếu bạn có cài đặt nhibernate trong web.config của mình. Nếu bạn có chúng trong một tệp bên ngoài thì bạn sử dụng định dạng mà tôi đã chỉ định ở trên. – Alistair

Các vấn đề liên quan