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