2012-09-17 55 views
5

我有一個SQL數據庫,我想鎖定一個表。我正在使用實體框架。基本上,每個想要併發寫入數據庫的進程都有很多。他們每個人都想更新某個表中的某一行。但是,我只希望其中一個能夠同時做到這一點。鎖定實體框架中的表

有沒有辦法鎖定整個表,比如阻止任何人放置新行或更新行?

感謝, 基督教

+2

這是默認行爲。除了使用交易,如果您在一次操作中更改多個表格 –

回答

2

這不是很清楚,我爲什麼你想這一點,但如果你真的要鎖定整個表,你可以:

  • 關閉行和頁鎖定使一切升級到表鎖

實施例改編自here

ALTER INDEX [MyIndexName] ON [dbo].[MyTableName] SET (ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF) 

注:這是假定你的應用程序僅僅「擁有」這些表 - 不想將此並打破一些其他應用程序

  • 設置查詢中使用串行化隔離級別
  • 改編自 here

實施例:

TransactionOptions topt = new TransactionOptions(); 
topt.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
using (var tran = new TransactionScope(TransactionScopeOption.Required, topt)) { 
    //do stuff 
} 
+0

是的,那就是我一直在尋找的東西。謝謝! – Christian

0

從簡短的描述來看,真正需要解決這個問題的表鎖是值得懷疑的。一些常用的解決方案包括:

1)創建一個序列化事務,讀取或更新感興趣的記錄作爲第一個語句。所有更新應該嘗試遵循這種模式。

2)創建一個像(1)那樣的read_committed事務,但包含對併發異常的重讀/重試能力。

很少有人需要鎖定桌子。有一種情況可能需要在涉及手動確定的身份字段值的一些計算以及與另一個會話發生衝突的可能性時。

對於只是調用,可以創建一個事務,並在開始時鎖定表。該鎖可以是「X」(獨佔)以防止讀取和寫入或非排他性以防止寫入。這個回答使用了SP:

SO #3662766

作爲替代方案,也可以使用的應用程序鎖。

sp_getapplock