2013-04-16 63 views
1

建議的副本不回答標題中的問題。將SQL Server表鎖定爲寫入但不能讀取

我想鎖定一張表,使其無法寫入,但可以讀取。那可能嗎?

這是在IsolationLevel.Serializable的交易中發生了什麼?或者只有那些受影響的行? (這是一個鎖的讀取以及?)

如果重要的:我在C#中這樣做。

+0

我想你可能想要readunmitmitted,但我不知道 –

+3

總是要非常小心使用讀取未提交。它不會取出共享鎖。在他的情況下,它可能是正確的使用,但他必須知道髒讀。 –

+0

@AndyNichols同意這意味着你可能會得到返回的數據,永遠不會被提交。 –

回答

-1

沒有它不可能。

只有擁有該鎖的會話才能訪問該表。在鎖定被釋放之前,其他任何會話都不能訪問它。

請參考以下鏈接:

http://msdn.microsoft.com/en-gb/library/ms173763.aspx

+0

該鏈接是針對mysql的。他想要MSSQL。因此,更合適的鏈接將是http://msdn.microsoft.com/en-gb/library/ms173763.aspx –

+0

您的鏈接是關於MySql服務器 –

+0

呃..我會用適當的鏈接編輯 – Freelancer

-1

你可能想尋找NOLOCK/READUNCOMMITTED選項:http://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/

它可以讓你讀出從當前鎖定的表中的數據,但要小心其含義:您最終可能會讀取「鬼影」數據,即已插入並在事務中回滾的數據。

+0

所以你說唯一的方法是真正鎖定表,然後ReadUncommitted(而不是選擇性鎖)? – ispiro

+0

@ispiro如果表被鎖定,那麼您實際上無法寫入,但是您可以使用ReadUncommitted從中讀取它。但是,你究竟想要達到什麼目的呢?你是否正在考慮故意鎖定餐桌,如果是這樣,爲什麼和什麼時間?可能還有其他方法可以研究。 –

+0

我想阻止兩個相同的行由不同的'作家'寫入。每個'作家'都會檢查它想要寫入的行是否不存在(在寫入之前) - 但是如果兩者同時檢查然後同時寫入 - 我會得到兩個相同的行。 – ispiro

0

您應該在表上創建一個UNIQUE約束。即使您設法通過第一個進程來鎖定表,另一個進程很可能只會在第一個進程存在之前被阻止。

然後,您可能會開始擺弄超時,以確保第二個進程在訪問表之前超時,並且您正打開一個痛苦的世界。

覆蓋任何構成副本的字段的UNIQUE約束是迄今爲止您的最佳選擇 - 並且將確保不會輸入重複項,因爲我理解您的問題(並闡述評論)是最終目標。