2012-05-17 128 views
3

嗨,我使用實體框架4.1代碼第一種方法。我有類MyContainer,繼承DBContext事務死鎖和的DbContext

我有一個具有7個步驟的每個步驟訪問許多存儲庫的方法(約60)。該過程中自動或碼的手動執行取決於業務邏輯和用戶要求的過程。現在的視圖用於自動處理性能點i創建的上下文即MyContainer一次對象,並把它傳遞給所有方法和處理它在過程結束時和它的工作正常和改進的performance.But當執行該過程碼的手動相同方法執行並創建容器並將其放置在方法本身中。例如下面,但它只是粗略的代碼。

public bool UpdateProcess(Process process, MyContainer container = null) 
    { 
     bool disposeContainer = false; 
     if (container == null) 
     { 
      container = new MyContainer(); 
      disposeContainer = true; 
     } 
     var result = SaveProcess(container, process); 
     container.SaveChanges(); 
     if (disposeContainer) 
      container.Dispose(); 
     return result; 
    } 

對於自動過程事務在過程的開始時被創建並在該過程的結束和用於手動事務在其根據UI上的用戶動作調用該方法的BLL創建結束。現在假設我的自動進程正在運行,同時用戶在UI上執行了一些操作,我得到了異常"Transaction (Process ID 65)死鎖了與另一個進程的鎖定資源並且已被選中「當UpdateProcess()方法從mannual和自動進程一起調用時,I把它放在container.SaveChanges()

任何幫助將不勝感激

如果我創建這個倉庫方法的事務範圍像

public bool UpdateProcess(Process process, MyContainer container = null) 
{   bool disposeContainer = false;   
      if (container == null) 
      {    
        container = new MyContainer();   
        disposeContainer = true;   
      } 
     using(var trans=new TransactionScop(TransactionScopeOption.RequiresNew))   
     { 
      var result = SaveProcess(container, process); 
      container.SaveChanges(); 
      trans.Complete(); 
     }   
      if (disposeContainer)   
      container.Dispose();   
      return result; 
} 

它工作正常。 但是我不想因爲交易已經在BLL已作出創建倉庫交易。

任何幫助將appericiated。

+0

一切工作正常,如果我創建並配置自動處理容器中的每一個方法,而不是在過程的開始創建的貨櫃,並在過程結束處置它 – ethicallogics

+2

我鏈接的定義[死鎖](http://en.wikipedia.org/wiki/Deadlock),如果它是多餘的道歉。 –

+0

感謝您的努力BT它不幫助我的問題。 – ethicallogics

回答

2

你遇到的問題(SQL死鎖)是大多數非平凡的客戶端 - 數據庫系統所共有的,並且可能很難解決。

設計可能發生死鎖代碼的首要規則是假設,他們將和設計應用程序,以適當地處理它們。這通常通過重新提交交易來處理。如微軟所記錄here

雖然死鎖可以最小化,但它們不能完全避免。這就是爲什麼前端應用程序應該被設計來處理死鎖。

爲了儘量減少您所看到的普通的方法,我採取任何死鎖如下:

與死鎖圖形
  1. 運行分析器能捕獲所有死鎖
  2. 導出所有死鎖的文字和調查他們爲什麼發生
  3. 檢查,看看這些可以通過使用表提示和/或降低TRANSATION隔離級別最小化
  4. 看看他們是否可以通過其他方式,如最小化更改操作順序
  5. 最後,在完成所有這些操作後,確保您在與數據庫通信時任何時候陷入死鎖&重新提交事務/查詢等。
+0

感謝您的努力。我完全同意你回覆和追查僵局等等。但問題是,當我不通過容器從進程,這意味着如果容器創建和處置每個方法的存儲庫它工作正常,但是當我從過程的開始,直到結束時通過相同的容器,然後這個死鎖問題出現。 – ethicallogics

+0

是的 - 這就是我期望看到的,因爲大型容器包含許多單獨的事務,因此其中一種方法可能會對另一種方法造成死鎖。從死鎖圖可以確定哪些語句是死鎖? – Johnv2020

+0

其在同一張表上的更新語句。 – ethicallogics