2012-12-19 91 views
0

我遇到了一個問題,我有一個表可以由多個線程編輯,每個線程創建一個交易以處理此表,如果交易需要這麼長時間要完成,其他線程將拋出異常「Query Timeout Expired」。我想有一個超時設置的交易。在同一張桌子上同時進行多筆交易

我可以使用線程鎖來處理這個問題;然而,有沒有辦法在服務器端做到這一點?我可以在SQL服務器中創建鎖嗎?任何幫助將不勝感激。

+0

你的代碼是什麼?你有什麼嘗試?給人們更多的信息。請閱讀[常見問題]和[問] –

回答

1

您收到的超時不是「事務」超時。這是一個普通的查詢超時。該查詢可以是選擇,更新,刪除等。超時值通常在連接字符串中進行控制。

我不相信你可以專門鎖定SQL Server中的行,頁面或表格,這可能是一件好事。坦率地說,這不是問題的癥結所在。您的交易執行時間太長。他們不應該花太多時間來讓其他查詢超時(可能至少30秒)。你將要花費很長時間才能讓你的服務器癱瘓。交易應該保持在幾秒鐘,最多的時間。

我建議你先看看需要事務(更新,刪除或插入)的語句,通過SSMS中的查詢分析器運行它們,並確保沒有進行表或索引掃描。我的猜測是這種情況正在發生,並且交易中涉及的表格很大(成百上千行或更多)。

+0

實際上,我使用的表格有數十萬條記錄,因此線程可能需要5或10分鐘才能更新該表格,換句話說就是完成其交易。我懷疑這是導致其他線程無法在此表上工作並拋出異常的原因。 – stoney78us

+0

好吧,你走了。那就是問題所在。您需要找到一種方法將交易時間縮短到幾秒或更少,或重新構建您的數據庫(這可能是必要的)。 –

+0

感謝你的回答。我想我知道這裏發生了什麼。我爲事務使用IsolationLevel.ReadCommitted,並阻止任何嘗試從其他線程訪問表並導致其他線程查詢超時。使用IsolationLevel.UnReadCommitted有助於但可能導致髒讀。 – stoney78us

相關問題