2010-03-02 66 views
3

我有一個總是可以更新的表,但之後突然我不能再更新表中的任何列。我仍然可以查詢整個表格,並且結果非常快速地返回,但是當我嘗試更新表格中的列時,更新查詢只是暫停並且什麼也不做。可以查詢SQL服務器表,但不更新

我嘗試使用

select req_transactionUOW 
from master..syslockinfo 
where req_spid = -2 

,看看一些孤立的交易被鎖定的表,但它不返回任何結果。

我似乎無法找到我的表被鎖定的跡象,但根本無法更新它。任何關於如何修復表格或其狀態的線索?

+0

當您嘗試更新它時會發生什麼?查詢超時,還是返回錯誤? – Justin

+0

查詢超時 – Nigel

回答

0

我猜這不是一個權限問題,因爲你沒有收到錯誤。

因此,我之前最接近的是當桌上的索引變得腐敗的時候。你有沒有嘗試刪除索引並重新創建它們?首先嚐試一個。

0

可否請你發出這個查詢:

SELECT COUNT(*) 
FROM mytable WITH (UPDLOCK, READPAST) 

這將跳過鎖定的記錄,並確保它返回相同的記錄數

SELECT COUNT(*) 
FROM mytable 

您可能需要與每一個重複它強制在表上索引,以確保沒有索引資源被鎖定。

+0

我試過了你提供的查詢,然後單獨使用索引嘗試每一個查詢,並且它們都返回相同的行數 – Nigel

+0

@Nigel:對任何記錄或某個特定記錄執行「UPDATE」鎖定?嘗試更新其他列時是否鎖定? – Quassnoi

+0

我無法更新任何列上的任何行。更新查詢似乎想要永遠運行時,它應該只需要一瞬間 – Nigel

0

如果您懷疑鎖定,我會做的第一件事情之一是運行sp_lock。它會給你一個所有當前鎖的列表。您可以使用DB_NAMEOBJECT_NAME函數獲取與dbidObjId列對應的名稱。

0

桌上有沒有觸發器? 如果是這樣,可能是觸發器失敗,因此阻止更新。

+0

nope,沒有觸發器 – Nigel

1

當你說「超時」時,它是否達到客戶端超時?例如,默認的.net命令超時是30秒。我會建議增加一個非常大的值或在SQL工具中運行更新(默認情況下不設置超時)。

除此之外,更新在某個點完成或錯誤和回滾:你是否留下足夠的時間?

還有阻塞,最後索引重建,上次統計更新,觸發器,意外交叉連接,MDF或LDF文件增長,IO差,OS分頁等等。並且您是否重新啓動了SQL實例或服務器去除環境問題並殺全部其他連接?

根本沒有足夠的信息來判斷現在抱歉。

0

你能更新其他表嗎?如果沒有(或者無論如何,如果你喜歡),你可以檢查事務日誌是否已滿(如果使用完整恢復模式)/事務日誌駐留的分區已滿。我認爲,如果SQL Server無法寫入事務日誌,您可能會遇到此行爲。

DBCC將成爲您的朋友:DBCC SQLPERF(LOGSPACE)顯示您,您的日誌使用了多少(百分比)。如果它(接近)100%,這可能是你的問題。

只是我的兩個便士值得。