我在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刪除時出現的。
感謝,
斯科特
不,我相信被刪除和插入的行將永遠不會相同。我會給它一個鏡頭。這是我以前沒有用過的。 – Scott 2010-12-11 01:22:08
我希望能做到這一點,但不幸的是我仍然陷入僵局。我開始懷疑插入是否現在是問題。在插入表格時,我不知道正在放置什麼隔離級別或鎖。 – Scott 2010-12-11 01:53:17
您可以嘗試爲表上的索引設置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