SQL Server 2000 自定義鎖超時的概述
此文章主要向大家描述的是SQL Server 2000 自定義鎖超時,當由于另一個事務(wù)已擁有一個資源的沖突鎖,會使 Microsoft® SQL Server™ 2000 無法將鎖授權(quán)給該資源的某個事務(wù)時,該事務(wù)被阻塞以等待該資源的操作完成。
如果這導(dǎo)致了死鎖,則SQL Server 將終止其中參與的一個事務(wù)(不涉及超時)。如果沒有出現(xiàn)死鎖,則在其它事務(wù)釋放鎖之前,請求鎖的事務(wù)被阻塞。默認情況下,沒有強制的超時期限,并 且除了試圖訪問數(shù)據(jù)外(有可能被無限期阻塞),沒有其它方法可以測試某個資源是否在鎖定之前已被鎖定。
說明 sp_who 系統(tǒng)存儲過程可用于確定進程是否正被阻塞以及被誰阻塞。LOCK_TIMEOUT 設(shè)置允許應(yīng)用程序設(shè)置語句等待阻塞資源的最長時間。當語句等待的時間大于LOCK_TIMEOUT 設(shè)置時,系統(tǒng)將自動取消阻塞的語句,并給應(yīng)用程序返回"已超過了鎖請求超時時段"的 1222 號錯誤信息。
但是,SQL Server 不回滾或取消任何包含該語句的事務(wù)。因此,應(yīng)用程序必須有捕獲 1222 號錯誤信息的錯誤處 理程序。如果應(yīng)用程序沒有捕獲錯誤,則會繼續(xù)運行,并未意識到事務(wù)中的個別語句已取消,從而當事務(wù)中的后續(xù)語句可能依賴于那條從未執(zhí)行的語句時, 導(dǎo)致應(yīng)用程序出錯。
執(zhí)行捕獲錯誤信息 1222 的錯誤處理程序使應(yīng)用程序得以處理發(fā)生超時的情況,并采取補救操作,例如可以自動重新提交阻塞的語句或者回滾整個事務(wù)。
若要確定當前 LOCK_TIMEOUT 設(shè)置,請執(zhí)行 @@LOCK_TIMEOUT 函數(shù),例如:
DECLARE @Timeout intSELECT @Timeout = @@lock_timeoutSELECT @TimeoutGO-----------------------------------------------------------------SET LOCK_TIMEOUT指定語句等待鎖釋放的毫秒數(shù)。語法SET LOCK_TIMEOUT timeout_period參數(shù)timeout_period是在 Microsoft® SQL Server™ 返回鎖定錯誤前經(jīng)過的毫秒數(shù)。值為 -1(默認值)時表示沒有超時期限(即無限期等待)。當鎖等待超過超時值時,將返回錯誤。
值為 0 時表示根本不等待,并且一遇到鎖就返回信息。注釋在連接開始時,該設(shè)置的值為 -1。設(shè)置更改后,新設(shè)置在其余的連接時間里一直有效。SET LOCK_TIMEOUT 的設(shè)置是在執(zhí)行或運行時設(shè)置,而不是在分析時設(shè)置。
READPAST 鎖定提示為該 SET 選項提供了另一種方式。權(quán)限SET LOCK_TIMEOUT 權(quán)限默認授予所有用戶。示例下例將SQL Server 2000 自定義鎖超時期限設(shè)置為 1,800 毫秒。SET LOCK_TIMEOUT 1800GO
上述的相關(guān)內(nèi)容就是對SQL Server 2000 自定義鎖超時的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】