2012-11-15 82 views
0

當我執行下面的SQL在Management Studio中的查詢返回預期的結果:SQL事務超時

SELECT MAX(ID) FROM table WHERE field = value; 

然而,當我的客戶端應用程序(的WinForms)執行的交易中的查詢的中間這個SQL超時而不返回值。我懷疑這是因爲事務包括其他SQL語句正在添加/修改相同的'表'。

我該如何解決這個問題?

+3

看起來像一個僵局。有沒有其他活動與同一張桌子相關? – J0HN

+1

死鎖不會超時,但會導致死鎖錯誤。但是,超時可能是由較早的阻塞鎖造成的。 – Polyfun

+1

你有權訪問服務器/數據庫上的活動監視器嗎?你將能夠看到你的衝突在哪裏。 – TEEKAY

回答

2

「SELECT MAX(ID)」是一個聚集函數,它會對錶進行大量鎖定 - 共享讀鎖可能會在表中的所有記錄上執行,當然在所有符合條件的記錄上,而其他則取決於是使用行還是頁面鎖。如果在MAX想要鎖定的這些記錄的任何上存在未完成的寫入鎖定,則MAX將超時。您需要了解同時還有哪些其他鎖。如果您使用的是SQL Server,那麼您可以使用SQL Profiler來獲取一條跟蹤信息,該跟蹤信息將向您顯示該表上的所有鎖,包括來自其他事務的鎖。

0

最後,我簡單地在事務開始之前使用MAX函數移動SQL語句,並將該值存儲爲變量,以便以後在轉換中使用。