2012-04-25 46 views
1

Linq中是否有任何工具可以明確地鎖定一個數據庫或一組表格?我正在處理一些不同的數據庫,我正在尋找透明的東西。令我驚訝的是,除了涉及Linq如何處理併發問題的主題之外,我無法在這個主題上找到太多內容。從C#Linq 4.0鎖定一個數據庫或一組表?

可替代地,用於鎖定數據庫的任何其它簡單的方法將是有趣的我(MSSQL中,Sybase尤其是)

+0

這是LINQ到實體? – BrokenGlass 2012-04-25 14:32:07

+0

不確定這是什麼意思。我的理解是我正在嘗試將Linq轉換爲Sql。我使用O/R設計器來初始設置我的數據庫上下文對象。 – Jerome 2012-04-25 14:40:35

回答

3

鎖定數據庫是很好的LINQ範圍之外;唯一相關的鎖定方面是特定提供程序用於提供併發保證的鎖定語義。如果您想要顯式鎖定超出事務處理自動應用的鎖定,則需要進入較低級別。

要通過實體框架execute arbitrary SQL commands,您可以在數據庫上下文中使用ExecuteStoreCommand方法,該方法只需要執行一個SQL字符串。如果由於某種原因,您使用的是舊版LINQ2SQL提供程序,它也有類似的ExecuteCommand方法來實現相同的目標。

真的沒有這樣的事,作爲一個「數據庫鎖」(至少它的數據庫術語),在某種意義上說,整個數據庫可以迅速切換到一個獨佔訪問模式,退了出去。剛剛獲得鎖

sp_dboption mydatabase, "single user", true 

這是遠不及「簡單」:這意味着只有一個對於Sybase(和MSSQL),有人用適當權限可以通過設置「單用戶」選項做到這一點一次只允許一個人連接到數據庫,因此您需要確保在設置選項時連接了您的連接,並且沒有其他人連接(它們將在沒有警告的情況下被啓動),而你,當你完成設置的選項後面關閉

在MySQL中,據我所知,有沒有辦法做到這一點短期改變目標數據庫上每個人的權限。

鎖定單個表是一個更容易一點,因爲大多數的數據庫服務器有這樣做的類似於SQL的語法。在MySQL中使用LOCK TABLES命令,用READWRITE鎖,但我強烈建議您閱讀鏈接頁面因爲MySQL鎖定的工作方式(IMO)有些奇怪。 Sybase同樣有一個LOCK TABLE命令,在這種情況下稱爲SHAREDEXCLUSIVE

您需要在transaction的上下文中鎖定表格,因此您可能希望在執行任何鎖定之前將代碼包裝在TransactionScope中。

相關問題