2012-07-16 18 views
3

我有一個數據庫表,我使用它作爲隊列系統,在這個數據庫表中,彼此交談的單獨進程創建並讀取表中的條目。例如,當用戶啓動搜索時,會創建一個條目,然後每隔一秒或兩秒運行的另一個進程將拾取該新條目,更新狀態,然後執行搜索,並在搜索完成後再次更新條目。這一切似乎與每小時數以千計的搜索很好地工作。在大型記錄集上鎖定問題

但是,我有一個主管理員屏幕,可以查看所有這些「工作」的狀態,但運行速度非常緩慢。我基本上在最後一個小時內返回表中的所有條目,以便我可以關注發生了什麼。我認爲我遇到了某種鎖定問題。我只需要閱讀每個條目,並不關心它的數據是否有點過時。我只是使用標準的'Select * from Table'語句,所以在作業不斷更新數據時,可能會在返回數據之前等待其他鎖定過期。

這種被某種遊標一次一行地返回每行一次會好嗎?任何其他想法?

謝謝

回答

2

如果你真的如果數據是有點過時不關心......或者你只有需要的數據是99.99%準確的,可以考慮使用WITH (NOLOCK)

SELECT * FROM Table WITH (NOLOCK); 

這將指示查詢中使用的READ UNCOMMITTED ISOLATION LEVEL,它具有以下行爲:

指定允許髒讀。 不會發布共享鎖,以防止其他事務修改當前的 事務讀取的數據,並且其他事務設置的排他鎖不會阻止當前事務讀取鎖定的數據。

請注意,NOLOCK may cause some inaccuracies in your data,所以它可能不是一個好主意,使用它在整個系統的其餘部分。

+0

謝謝,運作良好。 99.9%的準確性沒有問題,只是爲了讓人們瞭解一切如何運行。 – Damian 2012-07-16 21:40:21

2

您需要FROM yourtable WITH (NOLOCK)表提示。

您可能也想看看事務隔離在更新過程中,如果你是不是已經

1

NOLOCK的替代(這可能會導致非常糟糕的事情,比如錯過了行或重複行)是allow read committed snapshot isolation at the database level,然後發出您的查詢:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 
+0

這對我目前的需求來說可能有點複雜,但我會在後面記住這一點。感謝您的建議。 – Damian 2012-07-16 21:40:59