2010-03-22 40 views
13

thể trùng lặp:
Entity Framework with NOLOCKLàm thế nào để buộc Entity Framework không để khóa cơ sở dữ liệu

Tôi đang sử dụng EF4 và Net 4 để tải một số XML từ một tập tin vào một cơ sở dữ liệu .

Tôi có một lớp kết thúc tốt đẹp quanh ObjectContext và có các phương thức thêm đối tượng được ghép từ tệp XML vào các EntityCollections khác nhau đại diện cho các bảng của tôi.

Mỗi tệp XML chứa khoảng 200.000 đối tượng trung bình, lớp trình bao bọc tạo ObjectContext khi xây dựng và lưu trữ tham chiếu trong biến lớp riêng tư cục bộ sau đó được sử dụng bởi các phương thức.

Khi tôi đã hoàn tất việc tạo các đối tượng mà tôi gọi:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

Điều này tạo ra một giao dịch trên máy chủ đó là theo thiết kế EntityFramework. Tuy nhiên giao dịch này hoàn toàn khóa xuống DB của tôi ngay cả trên các bảng không được thêm vào.

Tôi đã thử nhiều thứ khác nhau để thử và nhận vòng bao gồm cả gói này lưu các thay đổi trong một TransactionScope như thế này:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, 
     new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) 
     { 
      entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

      transaction.Complete(); 
     } 

Tôi cũng đã cố gắng tạo ra TransactionScope trước khi tạo ObjectContext trong một nỗ lực để ảnh hưởng đến tiềm ẩn giao dịch đang được sử dụng trong SaveChanges.

Lý tưởng nhất là tôi muốn tải nhiều tệp cùng lúc, nhưng điều này sẽ không thể nếu DB bị khóa trong khi lưu thay đổi.

Có ai biết một công việc xung quanh vấn đề này không? Có cách nào để buộc EntityFramework không sử dụng giao dịch không?

Cảm ơn bạn đã giúp đỡ trước.

James

+0

Tôi nghĩ rằng vấn đề ở đây là bạn đang sử dụng TransactionScopeOption.Supress. Hãy thử sử dụng Bắt buộc. –

Trả lời

13

Chỉ cần đặt vấn đề này lên giường để đăng giải pháp của tôi là gì.

tôi đã cơ bản nhìn vào điều này từ cuối sai của vấn đề, một giao dịch được sử dụng khi gọi SaveChanges() nhưng bạn vẫn có thể đọc cơ sở dữ liệu bằng cách sử dụng một phương pháp như thế này:

private static FrameEntities GetEntities() 
    { 
     FrameEntities entities = new FrameEntities(); 
     entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
     return entities; 
    } 

này đặt cách ly cấp trước khi bạn cố đọc.

Điều này thường không được khuyến nghị vì bạn có thể đọc "bẩn" một phần dữ liệu nhưng đối với những gì im làm tốt.

+3

Điều này không hoạt động. Việc đặt mức cô lập giao dịch một mình sẽ không có hiệu lực. Bạn thực sự cần phải chạy trong một giao dịch để nó có hiệu lực. Tài liệu MSDN cho các trạng thái ĐỌC UNCOMMITTED Các giao dịch đang chạy ở mức READ UNCOMMITTED không phát hành các khóa chia sẻ. Điều này ngụ ý rằng bạn phải chạy trong một giao dịch để có được lợi ích. (Lấy từ msdn.microsoft.com/en-gb/library/ms173763.aspx).Cách tiếp cận của bạn có thể ít xâm phạm hơn, nhưng nó sẽ không đạt được bất cứ điều gì nếu bạn không sử dụng một giao dịch. –

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