2010-03-22 52 views
13

可能重複:
Entity Framework with NOLOCK如何強制實體框架不鎖定數據庫

我使用EF4和.Net 4從一個文件中的一些XML加載到數據庫。

我有一個圍繞ObjectContext的類,並有方法將XML文件中的編組對象添加到代表我的表的各種EntityCollections中。

每個XML文件平均包含大約200,000個對象,包裝類在構造時創建ObjectContext並將引用存儲在本地私有類變量中,然後由方法使用該變量。

當我完成了創建實體我打電話:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

這是按設計的EntityFramework在服務器上創建一個事務。然而,即使在未添加到的表上,此事務也完全鎖定了我的數據庫。

我曾嘗試過各種東西,試圖避開這個包括包裝保存更改在這樣一個TransactionScope:

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

      transaction.Complete(); 
     } 

我也試圖在試圖影響底層創建的ObjectContext之前創建的TransactionScope在SaveChanges期間使用的交易。

理想情況下,我希望一次加載多個文件,但如果數據庫在保存更改期間被鎖定,則這是不可能的。

有沒有人知道解決這個問題?是否有迫使EntityFramework不使用交易?

感謝您提前提供任何幫助。

James

+0

我認爲這裏的問題是你正在使用TransactionScopeOption.Supress。嘗試使用必需。 – 2013-03-18 23:56:41

回答

13

只是把這個牀上即時發佈我的解決方案是什麼。

基本上,我是從問題的錯誤的一端望着這,稱SaveChanges()當交易被使用,但你仍然可以使用的方法是這樣讀取數據庫:

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

這將設置隔離級別,然後再嘗試閱讀。

這通常不推薦,因爲你可以閱讀部分數據的「髒」,但是對於我做的很好。

+3

這不起作用。單獨設置事務隔離級別不會產生任何影響。您實際上需要在事務內部運行才能產生任何效果。 READ UNCOMMITTED狀態的MSDN文檔在READ UNCOMMITTED級別運行的事務不會發出共享鎖。這意味着您必須在交易中運行才能獲得收益。 (取自msdn.microsoft.com/en-gb/library/ms173763.aspx)。您的方法可能不那麼幹擾,但如果您不使用交易,它將無法實現。 – 2013-08-23 16:15:19