2011-08-19 47 views
3

我有一個非常簡單的選擇查詢像這樣:SQL查詢間歇返回任何結果

SELECT * FROM PWCWarehouse (nolock) WHERE PWCWarehouseID = 4

這個查詢被稱爲了很多,大部分返回該記錄的時間就好了,但偶爾即使記錄仍然存在,它也不會返回任何內容。這可能是什麼原因?這可能是因爲正在更新記錄的其他進程鎖定?我一直在嘗試不同的隔離級別,目前有Isolation level = RepeatableRead,這樣應該可以讀取易失性數據?

此表中只有6條記錄,它們從不增加或減少,此表上的唯一操作是上述讀取和更新。

任何想法這裏發生了什麼?

回答

5

這幾乎肯定是一個鎖定問題。

如果您在嘗試讀取記錄的同時更新該記錄(可能),應該使用NOLOCK提示NOT,因爲這將允許髒讀。

如果記錄已被刪除並正在被插入,或者已被更新但未提交,您的SELECT使用NOLOCK將不可見。

+1

2分鐘內2個NOLOCK問題?你得到這一個,我會得到另一個;) – gbn

+0

他們進來波。 – JNK

+0

那麼nolock會隱藏未完成交易中的記錄嗎?我想我的印象是,在閱讀時不會鎖定桌子,所以你的回答可能會很好地解釋這一點。 – Ghlouw

1

如果要讀取已更改但仍未提交的行,可以使用ReadUncommitted隔離級別。 這應該允許您在沒有鎖的情況下閱讀,但仍然可以看到未提交的更改。