2010-12-11 34 views
1

我在SQL Server中的表,看起來像:實體框架的操作,以SQL - 防止死鎖

Col1 Id -Int and Key  
Col2 ProductId int  
Col3 ProductDesc Varchar 

在我的Silverlight應用程序,我有兩個網格顯示從該表中的數據 - 通過產品ID分隔出換句話說,我把所有的產品A放在一個網格中,把所有的產品B放在另一個網格中。

當我選擇任何網格中的任何項目時,我將它寫出到表格中。如果我從網格中取消選擇一個項目,我從talble中刪除該行。由於Silverlight使用異步調用,當一個網格很忙時,用戶仍然可以使用另一個網格(這正是我想要的)。但是,如果用戶從一個網格中取消選擇項目,而從另一個網格插入項目,則會出現死鎖錯誤。

我的所有插入都在每個實體更新後完成,並且我調用了SubmitChanges()。正在以不同的方式處理刪除。由於EF中沒有DeleteAll,我正在使用Object Context的ExecuteStoreCommand()並提交DELETE查詢 - 這可能是我的問題來自。

如何使用同一個表來完成此操作而不會發生死鎖錯誤?我真的試圖避免爲每個網格創建一個單獨的表。

如果我使用EF從我的實體中刪除而不是ExecuteStoreCommand(),EF會更好地處理死鎖嗎?將表格加載到內存中似乎是一種資源,每次刪除一行。

編輯:我想補充一點,我證實我的死鎖是在EF正在插入的同時從talbe刪除時出現的。

感謝,

斯科特

回答

0

是您的delete語句觸摸同一行的其他操作?

如果沒有,嘗試添加一個ROWLOCK提示:從XYZ刪除(ROWLOCK)WHERE ...

+0

不,我相信被刪除和插入的行將永遠不會相同。我會給它一個鏡頭。這是我以前沒有用過的。 – Scott 2010-12-11 01:22:08

+0

我希望能做到這一點,但不幸的是我仍然陷入僵局。我開始懷疑插入是否現在是問題。在插入表格時,我不知道正在放置什麼隔離級別或鎖。 – Scott 2010-12-11 01:53:17

+0

您可以嘗試爲表上的索引設置allow_row_locks和allow_page_locks選項以避免頁面鎖定。例如:在some_table重建時使用(allow_row_locks = on,allow_page_locks = off)改變索引pk_some_table – KristoferA 2010-12-11 06:09:26

1

嘗試使用隔離級別爲您的交易:

using (TransactionScope scope = 
      new TransactionScope(TransactionScopeOption.RequiresNew, 
      new TransactionOptions() 
      { 
       IsolationLevel = IsolationLevel.ReadUncommitted 
      })) 
{ 
    // read only work - no locks on records. effectively SELECT xx from xxx WITH (NOLOCK) 
} 

然而,據我所知這是作用域EF上下文查詢。如果您使用ExecuteStoreCommand,那麼您可能必須手動在查詢本身上放置NOLOCK提示。

+0

這應該用於我的刪除還是我的插入?或兩者? – Scott 2010-12-11 02:47:18

+0

也沒有。這應該用於只讀查詢(SELECT)。插入和刪除*應該*具有排他鎖。 – RPM1984 2010-12-11 03:21:05

+0

在SQL Server Management Studio中(如果有訪問權限),您可以監視查詢並查看哪些導致了死鎖。 – RPM1984 2010-12-11 03:27:42

0

以下適用於我。

using (var context = new XXX()) // Replace XXX with your specifics 
{ 
    context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
    // your LINQ code here 
}